﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ПрограммныйИнтерфейс

// Возвращает текущую настройку использования электронных подписей.
//
// Возвращаемое значение:
//  Булево - если Истина, электронные подписи используются.
//
Функция ИспользоватьЭлектронныеПодписи() Экспорт
	
	Возврат ОбщиеНастройки().ИспользоватьЭлектронныеПодписи;
	
КонецФункции

// Возвращает текущую настройку использования шифрования.
//
// Возвращаемое значение:
//  Булево - если Истина, шифрование используется.
//
Функция ИспользоватьШифрование() Экспорт
	
	Возврат ОбщиеНастройки().ИспользоватьШифрование;
	
КонецФункции

// Возвращает текущую настройку проверки электронных подписей на сервере.
//
// Возвращаемое значение:
//  Булево - если Истина, электронные подписи будут проверяться на сервере.
//
Функция ПроверятьЭлектронныеПодписиНаСервере() Экспорт
	
	Возврат ОбщиеНастройки().ПроверятьЭлектронныеПодписиНаСервере;
	
КонецФункции

// Возвращает текущую настройку создания электронных подписей на сервере.
// Настройка также предполагает шифрование и расшифровку на сервере.
//
// Возвращаемое значение:
//  Булево - если Истина, электронные подписи будут создаваться на сервере.
//
Функция СоздаватьЭлектронныеПодписиНаСервере() Экспорт
	
	Возврат ОбщиеНастройки().СоздаватьЭлектронныеПодписиНаСервере;
	
КонецФункции

// Подписывает данные, возвращает подпись и добавляет подпись в объект, если указано.
//
// Общий подход к обработке значений свойств с типом ОписаниеОповещения в параметре ОписаниеДанных.
//  При выполнении обработки оповещения в нее передается структура параметров, в которой всегда есть
//  свойство "Оповещение" типа ОписаниеОповещения, обработку которого нужно выполнить для продолжения.
//  Кроме того, в структуре всегда есть свойство ОписаниеДанных, полученное при вызове процедуры.
//  При вызове оповещения в качестве значения должна передаваться структура. Если в процессе асинхронного
//  выполнения возникает ошибка, тогда в эту структуру нужно вставить свойство ОписаниеОшибки типа Строка.
// 
// Параметры:
//  ОписаниеДанных - Структура:
//    * Операция             - Строка - заголовок формы подписания данных, например Подписание файла.
//    * ЗаголовокДанных      - Строка - заголовок элемента или набора данных, например Файл.
//    * СообщитьОЗавершении  - Булево - (необязательный) - если Ложь, то не будет показано оповещение о успешном
//                           завершении операции для представления данных, указанного рядом с заголовком.
//    * ПоказатьКомментарий  - Булево - (необязательный) - разрешает ввод комментария в форме
//                           подписания данных. Если не указан, значит Ложь.
//    * ОтборСертификатов    - Массив - (необязательный) - содержит ссылки на элементы справочника.
//                           СертификатыЭлектроннойПодписиИШифрования, которые могут быть выбраны
//                           пользователем. Отбор блокирует возможность выбора других сертификатов
//                           из личного хранилища.
//                           - Структура:
//                             * Организация - ОпределяемыйТип.Организация - содержит ссылку на организацию,
//                                 по которой будет установлен отбор в списке сертификатов пользователя.
//    * БезПодтверждения     - Булево - (необязательный) - пропустить подтверждение пользователя, если
//                           в свойстве ОтборСертификатов только один сертификат и:
//                           а) либо для сертификата указано "Вводить пароль в программе электронной подписи";
//                           б) либо пользователь запомнил пароль к сертификату на время сеанса;
//                           в) либо пароль установлен ранее методом УстановитьПарольСертификата.
//                           Если в процессе подписания возникла ошибка, тогда будет открыта форма
//                           с возможностью указать пароль. Параметр ПоказатьКомментарий игнорируется.
//    * ПередВыполнением     - ОписаниеОповещения - (необязательный) - описание обработчика дополнительной
//                           подготовки данных после выбора сертификата, которым будут подписаны данные.
//                           В этом обработчике можно заполнить параметр Данные, если он зависит
//                           от сертификата, который в момент вызова уже вставлен в ОписаниеДанных
//                           как ВыбранныйСертификат (смотри ниже).
//                           Также можно переопределить параметр ВыбраннаяДоверенность в ОписаниеДанных.
//                           Следует учесть общий подход (смотри выше).
//    * ВыполнятьНаСервере   - Неопределено
//                           - Булево - (необязательный) - когда не указан или Неопределено,
//                           тогда выполнение будет определено автоматически: если есть сервер, то сначала
//                           на сервере, потом (при неудаче) на клиенте, потом сообщение о двух ошибках.
//                           Когда Истина: если разрешено выполнение на сервере, тогда выполнение
//                           только на сервере, при неудаче одно сообщение об ошибке на сервере.
//                           Когда Ложь: выполнение только на клиенте, как будто нет сервера.
//    * ПараметрыДополнительныхДействий - Произвольный - (необязательный) - если указан, то передается
//                           на сервер в процедуру ПередНачаломОперации общего модуля
//                           ЭлектроннаяПодписьПереопределяемый как ВходныеПараметры.
//    * КонтекстОперации     - Неопределено - (необязательный) - если указан, тогда в свойство будет
//                           установлено определенное значение произвольного типа, которое позволяет
//                           выполнить действие с тем же сертификатом повторно (у пользователя 
//                           не запрашивается ни пароль, ни подтверждение действия).
//                           В случае ошибки после вызова процедуры, повторное действие, выполненное
//                           с полученным контекстом, может быть также ошибочно.
//                           - Произвольный - (необязательный) - если определено, то действие будет выполнено
//                           с тем же сертификатом без запроса пароля или подтверждения.
//                           Параметр БезПодтверждения считается равным Истина.
//                           Параметры Операция, ЗаголовокДанных, ПоказатьКомментарий, ОтборСертификатов
//                           и ВыполнятьНаСервере игнорируются, их значения остаются такими же, как при первом вызове.
//                           Параметр ПараметрыДополнительныхДействий игнорируется.
//                           Процедура ПередНачаломОперации не вызывается.
//                           Если передать контекст, возвращенный процедурой Расшифровать, тогда
//                           пароль, введенный для сертификата, может быть использован, как если бы
//                           пароль был сохранен на время сеанса. В остальном контекст игнорируется.
//    * ПрекратитьВыполнение - Произвольный - если свойство существует и в процессе асинхронного выполнения возникает
//                           ошибка, выполнение прекращается без отображения формы операции или с закрытием этой формы,
//                           если она была открыта.
//
//    Вариант 1.
//    * Данные              - ДвоичныеДанные - данные для подписания.
//                          - Строка - адрес временного хранилища, содержащего двоичные данные.
//                          - ОписаниеОповещения - обработчик получения данных, который возвращает
//                          их в свойстве Данные (смотри выше общий подход). В момент вызова
//                          в ОписаниеДанных уже вставлен параметр ВыбранныйСертификат (смотри ниже).
//                          - Структура:
//                             * КонвертXML       - см. ЭлектроннаяПодписьКлиент.КонвертXML
//                             * ПараметрыXMLDSig - см. ЭлектроннаяПодписьКлиент.ПараметрыXMLDSig
//                          - Структура:
//                             * ПараметрыCMS - см. ЭлектроннаяПодписьКлиент.ПараметрыCMS
//                             * Данные  - Строка - произвольная строка для подписания,
//                                       - ДвоичныеДанные - двоичные данные для подписания.
//    * Объект              - ЛюбаяСсылка - (необязательный) - ссылка на объект , к которому нужно добавить подпись.
//                          Если не указан, то подпись не требуется добавлять.
//                          - ОписаниеОповещения - (необязательный) - обработчик добавления подписи в
//                          регистр сведений ЭлектронныеПодписи. Следует учесть общий подход (смотри выше).
//                          В момент вызова в ОписаниеДанных уже вставлен параметр СвойстваПодписи.
//                          В случае параметра НаборДанных, в ОписаниеДанных вставляется
//                          свойство ТекущийЭлементНабораДанных, содержащее параметр СвойстваПодписи.
//    * ВерсияОбъекта       - Строка - (необязательный) - версия данных объекта для проверки и
//                          блокировки объекта перед добавлением подписи.
//    * Представление       - ЛюбаяСсылка - (необязательный), если параметр не указан,
//                                  тогда представление вычисляется по значению свойства Объект.
//                          - Строка
//                          - Структура:
//                             ** Значение      - ЛюбаяСсылка
//                                              - ОписаниеОповещения - для открытия.
//                             ** Представление - Строка - представление значения.
//    Вариант 2.
//    * НаборДанных         - Массив - структуры со свойствами, описанными в Варианте 1.
//    * ПредставлениеНабора - Строка - представления нескольких элементов набора данных, например, "Файлы (%1)".
//                          В это представление в параметр %1 заполняется количество элементов.
//                          По гиперссылке можно открыть список.
//                          Если в наборе данных 1 элемент, тогда используется значение
//                          в свойстве Представление свойства НаборДанных, если не указано, тогда
//                          представление вычисляется по значению свойства Объект элемента набора данных.
//    * СписокПредставлений - СписокЗначений
//                          - Массив - (необязательный) - произвольный список элементов
//                          или массив со значениями, как у свойства Представление, которые
//                          сможет открыть пользователь. Если не указан, то заполняется из
//                          свойств Представление или Объект в свойстве НаборДанных.
//
//  Форма - ФормаКлиентскогоПриложения - форма, из которой нужно получить уникальный идентификатор,
//                                который будет использоваться при блокировке объекта.
//        - УникальныйИдентификатор - уникальный идентификатор, который будет
//                                использоваться при блокировке объекта.
//        - Неопределено     - использовать стандартную форму.
//
//  ОбработкаРезультата - ОписаниеОповещения -
//     Требуется для нестандартной обработки результата, например, если не указан параметр Объект и/или Форма.
//     В результат передается входной параметр ОписаниеДанных, который в успешном случае дополняется свойствами:
//     # Успех - Булево - Истина, если все прошло успешно. Если Успех = Ложь, то частичное завершение
//               определяется по наличию свойства СвойстваПодписи. Если есть, то шаг выполнен.
//     # Отказ - Булево - Истина, если пользователь отменил операцию интерактивно.
//     # ПользовательНажалКнопкуПодписать - Булево - если Истина, то пользователь хотя бы раз
//               нажал на кнопку Подписать. Используется для сценариев, когда для продолжения бизнес-процесса
//               достаточно простой подписи (намерения установить подпись), а установка квалифицированной подписи
//               является дополнением, которое можно реализовать позднее, если возникли технические проблемы.
//     # ВыбранныйСертификат - Структура - содержит свойства сертификата:
//         ## Ссылка    - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - ссылка на сертификат.
//         ## Отпечаток - Строка - отпечаток сертификата в формате строки Base64.
//         ## Данные    - Строка - адрес временного хранилища, содержащего двоичные данные сертификата.
//     # ВыбраннаяДоверенность - ЛюбаяСсылка
//     # СвойстваПодписи = Строка - адрес временного хранилища, содержащего описанную ниже структуру,
//               если подписание произошло на сервере.
//                       = Структура - см. ЭлектроннаяПодписьКлиентСервер.НовыеСвойстваПодписи
//               При передаче параметра НаборДанных, свойство нужно проверять в нем.
//                       
//  ПараметрыПодписи - см. НовыйТипПодписи
//
Процедура Подписать(ОписаниеДанных, Форма = Неопределено, ОбработкаРезультата = Неопределено, ПараметрыПодписи = Неопределено) Экспорт
	
	КлиентскиеПараметры = Новый Структура;
	КлиентскиеПараметры.Вставить("ОписаниеДанных", ОписаниеДанных);
	КлиентскиеПараметры.Вставить("Форма", Форма);
	КлиентскиеПараметры.Вставить("ОбработкаРезультата", ОбработкаРезультата);
	
	ОбработкаЗавершения = Новый ОписаниеОповещения("СтандартноеЗавершение",
		ЭлектроннаяПодписьСлужебныйКлиент, КлиентскиеПараметры);
	
	Если ОписаниеДанных.Свойство("КонтекстОперации")
	   И ТипЗнч(ОписаниеДанных.КонтекстОперации) = Тип("ФормаКлиентскогоПриложения") Тогда
		
		ЭлектроннаяПодписьСлужебныйКлиент.ПродлитьХранениеКонтекстаОперации(ОписаниеДанных);
		НачалоИмениФормы = "Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Форма.";
		
		Если ОписаниеДанных.КонтекстОперации.ИмяФормы = НачалоИмениФормы + "ПодписаниеДанных" Тогда
			ОписаниеДанных.КонтекстОперации.ВыполнитьПодписание(КлиентскиеПараметры, ОбработкаЗавершения);
			Возврат;
		КонецЕсли;
		Если ОписаниеДанных.КонтекстОперации.ИмяФормы = НачалоИмениФормы + "РасшифровкаДанных" Тогда
			КлиентскиеПараметры.Вставить("УказанКонтекстДругойОперации");
		КонецЕсли;
	КонецЕсли;
	
	СерверныеПараметры = Новый Структура;
	СерверныеПараметры.Вставить("Операция",            НСтр("ru = 'Подписание данных'"));
	СерверныеПараметры.Вставить("ЗаголовокДанных",     НСтр("ru = 'Данные'"));
	СерверныеПараметры.Вставить("ПоказатьКомментарий", Ложь);
	СерверныеПараметры.Вставить("ОтборСертификатов");
	СерверныеПараметры.Вставить("ВыполнятьНаСервере");
	СерверныеПараметры.Вставить("ПараметрыДополнительныхДействий");
	СерверныеПараметры.Вставить("ОповеститьОбОкончанииСрокаДействия", Истина);
	ЗаполнитьЗначенияСвойств(СерверныеПараметры, ОписаниеДанных);
	
	СерверныеПараметры.Вставить("ТипПодписи", ПараметрыПодписи);
	
	ЭлектроннаяПодписьСлужебныйКлиент.ОткрытьНовуюФорму("ПодписаниеДанных",
		КлиентскиеПараметры, СерверныеПараметры, ОбработкаЗавершения);
	
КонецПроцедуры

// Конструктор параметра ТипПодписи для процедуры Подписать.
// Игнорируется для подписи конверта XML.
// 
// Параметры:
//  ТипПодписи - ПеречислениеСсылка.ТипыПодписиКриптографии
// 
// Возвращаемое значение:
//  Структура:
//   * ТипыПодписи - Массив - массив типов подписей для выбора.
//   * Видимость - Булево - видимость типа подписи на форме подписания.
//   * Доступность - Булево - доступность типа подписи на форме подписания.
//   * ВыборДоверенности - Булево - показывать поле выбора доверенности.
//
Функция НовыйТипПодписи(ТипПодписи = Неопределено) Экспорт
	
	Структура = Новый Структура;
	Структура.Вставить("ТипыПодписи", Новый Массив);
	Структура.Вставить("Видимость", Ложь);
	Структура.Вставить("Доступность", Ложь);
	Структура.Вставить("ВыборДоверенности", Ложь);
	
	Если ЗначениеЗаполнено(ТипПодписи) Тогда
		Структура.ТипыПодписи.Добавить(ТипПодписи);
	КонецЕсли;
	
	Возврат Структура;
	
КонецФункции

// Предлагает пользователю выбрать файлы подписей для добавления к объекту и добавляет их.
//
// Общий подход к обработке значений свойств с типом ОписаниеОповещения в параметре ОписаниеДанных.
//  При выполнении обработки оповещения в нее передается структура параметров, в которой всегда есть
//  свойство "Оповещение" типа ОписаниеОповещения, обработку которого нужно выполнить для продолжения.
//  Кроме того, в структуре всегда есть свойство ОписаниеДанных, полученное при вызове процедуры.
//  При вызове оповещения в качестве значения должна передаваться структура. Если в процессе асинхронного
//  выполнения возникает ошибка, тогда в эту структуру нужно вставить свойство ОписаниеОшибки типа Строка.
// 
// Параметры:
//  ОписаниеДанных - Структура:
//    * ЗаголовокДанных      - Строка - заголовок элемента данных, например Файл.
//    * ПоказатьКомментарий  - Булево - (необязательный) - разрешает ввод комментария в форме
//                             добавления подписей. Если не указан, значит Ложь.
//    * Объект               - ЛюбаяСсылка - (необязательный) - ссылка на объект , к которому нужно добавить подпись.
//                           - ОписаниеОповещения - (необязательный) - обработчик добавления подписи в
//                             регистр сведений ЭлектронныеПодписи. Следует учесть общий подход (смотри выше).
//                             В момент вызова в ОписаниеДанных уже вставлен параметр Подписи.
//    * ВерсияОбъекта        - Строка - (необязательный) - версия данных объекта для проверки и
//                             блокировки объекта перед добавлением подписи.
//    * Представление        - ЛюбаяСсылка
//                           - Строка - (необязательный), если не указан, тогда
//                             представление вычисляется по значению свойства Объект.
//    * Данные               - ДвоичныеДанные - (необязательный) - данные для проверки подписи.
//                           - Строка - (необязательный) - адрес временного хранилища, содержащего двоичные данные.
//                           - ОписаниеОповещения - (необязательный) - обработчик получения данных, который
//                             возвращает их в свойстве Данные (смотри выше общий подход).
//
//  Форма - ФормаКлиентскогоПриложения - форма, из которой нужно получить уникальный идентификатор,
//        который будет использоваться при блокировке объекта.
//        - УникальныйИдентификатор - уникальный идентификаторы, который будет
//        использоваться при блокировке объекта.
//        - Неопределено - использовать стандартную форму.
//
//  ОбработкаРезультата - ОписаниеОповещения -
//     Требуется для нестандартной обработки результата - например, если не указан параметр Объект и/или Форма.
//     В результат передается входной параметр ОписаниеДанных, который в успешном случае дополняется свойствами:
//     # Успех - Булево - Истина, если все прошло успешно.
//     # Отказ - Булево - Истина, если пользователь отменил операцию интерактивно.
//     # Подписи - Массив - который содержит элементы:
//       ## СвойстваПодписи = Строка - адрес временного хранилища, содержащего описанную ниже структуру.
//                          = Структура - развернутое описание подписи
//           ### Подпись             - ДвоичныеДанные - результат подписания.
//           ### УстановившийПодпись - СправочникСсылка.Пользователи - пользователь, который
//                                   подписал объект информационной базы.
//           ### Комментарий         - Строка - комментарий, если он был введен при подписании.
//           ### ИмяФайлаПодписи     - Строка - имя файла, из которого добавлена подпись.
//           ### ДатаПодписи         - Дата - дата, когда подпись была сделана. Имеет смысл для случаев,
//                                   когда дату невозможно извлечь из данных подписи. Если не
//                                   указана или пустая, тогда используется текущая дата сеанса.
//           ### ДатаПроверкиПодписи - Дата - дата проверки подписи после добавления из файла, если
//                                   не указано свойство Данные в параметре ОписаниеДанных,
//                                   возвращает пустую дату.
//           ### ПодписьВерна        - Булево - результат проверки подписи после добавления из файла, если
//                                    не указано свойство Данные в параметре ОписаниеДанных,
//                                    возвращает Ложь.
//
//           Производные свойства:
//           ### Сертификат          - ДвоичныеДанные - содержит выгрузку сертификата,
//                                   который использовался для подписания (содержится в подписи).
//           ### Отпечаток           - Строка - отпечаток сертификата в формате строки Base64.
//           ### КомуВыданСертификат - Строка - представление субъекта, полученное из двоичных данных сертификата.
//
Процедура ДобавитьПодписьИзФайла(ОписаниеДанных, Форма = Неопределено, ОбработкаРезультата = Неопределено) Экспорт
	
	ОписаниеДанных.Вставить("Успех", Ложь);
	
	СерверныеПараметры = Новый Структура;
	СерверныеПараметры.Вставить("ЗаголовокДанных", НСтр("ru = 'Данные'"));
	СерверныеПараметры.Вставить("ПоказатьКомментарий", Ложь);
	ЗаполнитьЗначенияСвойств(СерверныеПараметры, ОписаниеДанных);
	
	КлиентскиеПараметры = Новый Структура;
	КлиентскиеПараметры.Вставить("ОписаниеДанных",      ОписаниеДанных);
	КлиентскиеПараметры.Вставить("Форма",               Форма);
	КлиентскиеПараметры.Вставить("ОбработкаРезультата", ОбработкаРезультата);
	ЭлектроннаяПодписьСлужебныйКлиент.НастроитьПредставлениеДанных(КлиентскиеПараметры, СерверныеПараметры);
	
	ФормаДобавления = ОткрытьФорму("ОбщаяФорма.ДобавлениеЭлектроннойПодписиИзФайла", СерверныеПараметры,,,,,
		Новый ОписаниеОповещения("СтандартноеЗавершение", ЭлектроннаяПодписьСлужебныйКлиент, КлиентскиеПараметры));
	
	Если ФормаДобавления = Неопределено Тогда
		Если ОбработкаРезультата <> Неопределено Тогда
			ВыполнитьОбработкуОповещения(ОбработкаРезультата, ОписаниеДанных);
		КонецЕсли;
		Возврат;
	КонецЕсли;
	
	ФормаДобавления.КлиентскиеПараметры = КлиентскиеПараметры;
	
	Контекст = Новый Структура;
	Контекст.Вставить("ОбработкаРезультата", ОбработкаРезультата);
	Контекст.Вставить("ФормаДобавления", ФормаДобавления);
	Контекст.Вставить("ПроверитьМенеджерКриптографииНаКлиенте", Истина);
	Контекст.Вставить("ОписаниеДанных", ОписаниеДанных);
	
	Если (ПроверятьЭлектронныеПодписиНаСервере()
		Или СоздаватьЭлектронныеПодписиНаСервере())
		И Не ЗначениеЗаполнено(ФормаДобавления.МенеджерКриптографииНаСервереОписаниеОшибки) Тогда
		
		Контекст.ПроверитьМенеджерКриптографииНаКлиенте = Ложь;
		ЭлектроннаяПодписьСлужебныйКлиент.ДобавитьПодписьИзФайлаПослеСозданияМенеджераКриптографии(
			Неопределено, Контекст);
	Иначе
		
		ПараметрыСоздания = ЭлектроннаяПодписьСлужебныйКлиент.ПараметрыСозданияМенеджераКриптографии();
		ПараметрыСоздания.ПоказатьОшибку = Неопределено;
		
		ЭлектроннаяПодписьСлужебныйКлиент.СоздатьМенеджерКриптографии(
			Новый ОписаниеОповещения("ДобавитьПодписьИзФайлаПослеСозданияМенеджераКриптографии",
				ЭлектроннаяПодписьСлужебныйКлиент, Контекст),
			"", ПараметрыСоздания);
			
	КонецЕсли;
	
КонецПроцедуры

// Предлагает пользователю выбрать подписи для сохранения вместе с данными объекта.
//
// Общий подход к обработке значений свойств с типом ОписаниеОповещения в параметре ОписаниеДанных.
//  При выполнении обработки оповещения в нее передается структура параметров, в которой всегда есть
//  свойство "Оповещение" типа ОписаниеОповещения, обработку которого нужно выполнить для продолжения.
//  Кроме того, в структуре всегда есть свойство ОписаниеДанных, полученное при вызове процедуры.
//  При вызове оповещения в качестве значения должна передаваться структура. Если в процессе асинхронного
//  выполнения возникает ошибка, тогда в эту структуру нужно вставить свойство ОписаниеОшибки типа Строка.
// 
// Параметры:
//  ОписаниеДанных - Структура:
//    * ЗаголовокДанных      - Строка - заголовок элемента данных, например Файл.
//    * ПоказатьКомментарий  - Булево - (необязательный) - разрешает ввод комментария в форме
//                           добавления подписей. Если не указан, значит Ложь.
//    * Представление        - ЛюбаяСсылка
//                           - Строка - (необязательный), если не указан, тогда
//                           представление вычисляется по значению свойства Объект.
//    * Объект               - ЛюбаяСсылка - ссылка на объект, из которого нужно получить список подписей.
//                           - Строка - адрес временного хранилища массива подписей с составом свойств,
//                           как возвращает процедура ДобавитьПодписьИзФайла.
//    * Данные               - ОписаниеОповещения - обработчик сохранения данных и получения полного имени
//                           файла с путем (после его сохранения), возвращаемое в свойстве ПолноеИмяФайла
//                           типа Строка для сохранения электронных подписей (смотри выше общий подход).
//                           Если расширение для работы с 1С:Предприятием не подключено, то нужно вернуть
//                           имя файла без пути.
//                           Если свойство не будет вставлено или заполнено - это считается отказом
//                           от продолжения и будет вызвана ОбработкаРезультата с результатом Ложь.
//
//                           Для пакетного запроса разрешений у пользователя веб-клиента на сохранение файла данных
//                           и подписей нужно вставить параметр ОбработкаЗапросаРазрешений типа ОписаниеОповещения.
//                           В процедуру будет передана Структура со свойствами
//                              # Вызовы               - Массив - с описанием вызовов для сохранения подписей.
//                              # ОбработкаПродолжения - ОписаниеОповещения - оповещение, которое нужно выполнить
//                                                     после запроса разрешений, - параметры процедуры как у
//                                                     оповещения для метода НачатьЗапросРазрешенияПользователя.
//                                                     Если разрешение не получено, значит, все отменено.
//
//  ОбработкаРезультата - ОписаниеОповещения -
//     В результат передается параметр типа Булево - Истина, если все прошло успешно.
//
Процедура СохранитьДанныеВместеСПодписью(ОписаниеДанных, ОбработкаРезультата = Неопределено) Экспорт
	
	ЭлектроннаяПодписьСлужебныйКлиент.СохранитьДанныеВместеСПодписью(ОписаниеДанных, ОбработкаРезультата);
	
КонецПроцедуры

// Проверяет действительность подписи и сертификата.
// Сертификат всегда проверяется на сервере, если администратор
// настроил проверку электронных подписей на сервере.
//
// Параметры:
//   Оповещение           - ОписаниеОповещения - оповещение о результате выполнения следующих типов:
//             = Булево       - Истина, если проверка выполнена успешно - если ПараметрыПроверки - Неопределено
//             = Строка       - описание ошибки проверки подписи.
//             = Неопределено - не удалось получить менеджер криптографии (когда не указан).
//             = см. ЭлектроннаяПодписьКлиентСервер.РезультатПроверкиПодписи - если
//             ПараметрыПроверки.РезультатВВидеСтруктуры - Истина.
//   ИсходныеДанные       - ДвоичныеДанные - двоичные данные, которые были подписаны.
//                          Математическая проверка выполняется на стороне клиента, даже когда
//                          администратор настроил проверку электронных подписей на сервере,
//                          если указан менеджер криптографии или его удалось получить без ошибки.
//                          Это повышает производительность, а также безопасность, когда проверяется подпись
//                          в расшифрованном файле (он не будет передан на сервер).
//                        - Строка - адрес временного хранилища, содержащего исходные двоичные данные.
//                        - Структура:
//                           * КонвертXML       - Строка - подписанный КонвертXML,
//                                                         смотри также функцию КонвертXML.
//                           * ПараметрыXMLDSig - см. ЭлектроннаяПодписьКлиент.ПараметрыXMLDSig
//                        - Структура:
//                           * ПараметрыCMS - см. ЭлектроннаяПодписьКлиент.ПараметрыCMS
//                           * Данные  - Строка - произвольная строка для подписания,
//                                     - ДвоичныеДанные - двоичные данные для подписания.
//   Подпись              - ДвоичныеДанные - двоичные данные электронной подписи.
//                        - Строка         - адрес временного хранилища, содержащего двоичные данные.
//                        - Неопределено   - если ИсходныеДанные - конверт SOAP.
//   МенеджерКриптографии - Неопределено - получить менеджер криптографии по умолчанию
//                          (менеджер первой программы в списке, как настроил администратор).
//                        - МенеджерКриптографии - использовать указанный менеджер криптографии.
//   НаДату               - Дата - проверить сертификат на указанную дату,
//                          если дату не удалось извлечь из подписи или если проверяется КонвертXML.
//                          Если параметр не заполнен, тогда проверять на текущую дату сеанса,
//                          если дату не удалось извлечь из подписи или если проверяется КонвертXML.
//   ПараметрыПроверки    - см. ПараметрыПроверкиПодписи
//                        - Неопределено - показать ошибку создания менеджера криптографии (когда не указан).
//
Процедура ПроверитьПодпись(Оповещение, ИсходныеДанные, Подпись,
	МенеджерКриптографии = Неопределено,
	НаДату = Неопределено,
	ПараметрыПроверки = Неопределено) Экспорт
	
	ЭлектроннаяПодписьСлужебныйКлиент.ПроверитьПодпись(
		Оповещение, ИсходныеДанные, Подпись, МенеджерКриптографии, НаДату, ПараметрыПроверки);
	
КонецПроцедуры

// Конструктор параметра "ПараметрыПроверки" для процедуры "ПроверитьПодпись".
// 
// Возвращаемое значение:
//  Структура:
//   * ПоказатьОшибкуСозданияМенеджераКриптографии - Булево - показать ошибку 
//              создания менеджера криптографии (когда не указан).
//   * РезультатВВидеСтруктуры - Булево - если Истина, результат будет в виде
//      см. ЭлектроннаяПодписьКлиентСервер.РезультатПроверкиПодписи
//
Функция ПараметрыПроверкиПодписи() Экспорт
	
	Структура = Новый Структура;
	Структура.Вставить("ПоказатьОшибкуСозданияМенеджераКриптографии", Истина);
	Структура.Вставить("РезультатВВидеСтруктуры", Ложь);
	Возврат Структура;
	
КонецФункции

// Шифрует данные, возвращает сертификаты шифрования и добавляет их в объект, если указано.
// 
// Общий подход к обработке значений свойств с типом ОписаниеОповещения в параметре ОписаниеДанных.
//  При выполнении обработки оповещения в нее передается структура параметров, в которой всегда есть
//  свойство "Оповещение" типа ОписаниеОповещения, обработку которого нужно выполнить для продолжения.
//  Кроме того, в структуре всегда есть свойство ОписаниеДанных, полученное при вызове процедуры.
//  При вызове оповещения в качестве значения должна передаваться структура. Если в процессе асинхронного
//  выполнения возникает ошибка, тогда в эту структуру нужно вставить свойство ОписаниеОшибки типа Строка.
// 
// Параметры:
//  ОписаниеДанных - Структура:
//    * Операция             - Строка - заголовок формы шифрования данных, например Шифрование файла.
//    * ЗаголовокДанных      - Строка - заголовок элемента или набора данных, например Файл.
//    * СообщитьОЗавершении  - Булево - (необязательный) - если Ложь, то не будет показано оповещение об успешном
//                           завершении операции для представления данных, указанного рядом с заголовком.
//    * НаборСертификатов    - Строка - (необязательный) адрес временного хранилища, содержащего массив, описанный ниже.
//                           - Массив - (необязательный) содержит значения
//                           типа СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования или
//                           типа ДвоичныеДанные (выгрузка сертификата).
//                           - ЛюбаяСсылка - (необязательный) - ссылка на объект, для которого необходимо получить сертификаты.
//    * ИзменятьНабор        - Булево - если Истина и НаборСертификатов задан и содержит только ссылки
//                           на сертификаты, тогда будет возможность изменить состав сертификатов.
//    * БезПодтверждения     - Булево - (необязательный) - пропустить подтверждение пользователя,
//                           если указано свойство ОтборСертификатов.
//    * ВыполнятьНаСервере   - Неопределено
//                           - Булево - (необязательный) - когда не указан или Неопределено,
//                           тогда выполнение будет определено автоматически: если есть сервер, то сначала
//                           на сервере, потом (при неудаче) на клиенте, потом сообщение о двух ошибках.
//                           Когда Истина: если разрешено выполнение на сервере, тогда выполнение
//                           только на сервере, при неудаче одно сообщение об ошибке на сервере.
//                           Когда Ложь: выполнение только на клиенте, как будто нет сервера.
//    * КонтекстОперации     - Неопределено - (необязательный) - если указан, тогда в свойство будет
//                           установлено определенное значение произвольного типа, которое позволяет
//                           выполнить действие с теми же сертификатами шифрования повторно (у пользователя
//                           не запрашивается подтверждение действия).
//                           - Произвольный - (необязательный) - если определено, то действие будет выполнено
//                           с теми же сертификатами шифрования.
//                           Параметр БезПодтверждения считается равным Истина.
//                           Параметры Операция, ЗаголовокДанных, НаборСертификатов, ИзменятьНабор
//                           и ВыполнятьНаСервере игнорируются, их значения остаются такими же, как при первом вызове.
//    * ПрекратитьВыполнение - Произвольный - если свойство существует и в процессе асинхронного выполнения возникает
//                           ошибка, выполнение прекращается без отображения формы операции или с закрытием этой формы,
//                           если она была открыта.
//
//    Вариант 1.
//    * Данные                - ДвоичныеДанные - данные для шифрования.
//                            - Строка - адрес временного хранилища, содержащего двоичные данные.
//                            - ОписаниеОповещения - обработчик получения данных, который возвращает
//                            их в свойстве Данные (смотри выше общий подход).
//    * РазмещениеРезультата  - Неопределено - (необязательный) - описывает куда поместить зашифрованные данные.
//                            Если не указан или Неопределено, тогда через параметр ОбработкаРезультата.
//                            - ОписаниеОповещения - обработчик сохранения зашифрованных данных.
//                            Следует учесть общий подход (смотри выше).
//                            В момент вызова в ОписаниеДанных уже вставлен параметр ЗашифрованныеДанные.
//                            В случае параметра НаборДанных, в ОписаниеДанных вставляется
//                            свойство ТекущийЭлементНабораДанных, содержащее параметр ЗашифрованныеДанные.
//    * Объект                - ЛюбаяСсылка - (необязательный) - ссылка на объект, который необходимо зашифровать.
//                            Если не указан, то сертификаты шифрования не требуется добавлять.
//    * ВерсияОбъекта         - Строка - (необязательный) - версия данных объекта для проверки и
//                            блокировки объекта перед добавлением сертификатов шифрования.
//    * Представление       - ЛюбаяСсылка - (необязательный), если параметр не указан,
//                                  тогда представление вычисляется по значению свойства Объект.
//                          - Строка
//                          - Структура:
//                             ** Значение      - ЛюбаяСсылка
//                                              - ОписаниеОповещения - для открытия.
//                             ** Представление - Строка - представление значения.
//
//    Вариант 2.
//    * НаборДанных           - Массив - структуры со свойствами, описанными в Варианте 1.
//    * ПредставлениеНабора   - Строка - представления нескольких элементов набора данных, например, "Файлы (%1)".
//                            В это представление в параметр %1 заполняется количество элементов.
//                            По гиперссылке можно открыть список.
//                            Если в наборе данных 1 элемент, тогда используется значение
//                            в свойстве Представление свойства НаборДанных, если не указано, тогда
//                            представление вычисляется по значению свойства Объект элемента набора данных.
//    * СписокПредставлений   - СписокЗначений
//                            - Массив - (необязательный) - произвольный список элементов
//                            или массив со значениями, как у свойства Представление, которые
//                            сможет открыть пользователь. Если не указан, то заполняется из
//                            свойств Представление или Объект в свойстве НаборДанных.
//
//  Форма - ФормаКлиентскогоПриложения  - форма, из которой нужно получить уникальный идентификатор, который будет
//        использоваться при помещении зашифрованных данных во временное хранилище.
//        - УникальныйИдентификатор - уникальный идентификатор, который будет
//        использоваться при помещении зашифрованных данных во временное хранилище.
//        - Неопределено      - использовать стандартную форму.
//
//  ОбработкаРезультата - ОписаниеОповещения -
//     Требуется для нестандартной обработки результата, если не указан параметр Форма и/или РазмещениеРезультата.
//     В результат передается входной параметр ОписаниеДанных, который в успешном случае дополняется свойствами:
//     # Успех - Булево - Истина, если все прошло успешно. Если Успех = Ложь, то частичное завершение
//               определяется по наличию свойства ЗашифрованныеДанные. Если есть, то шаг выполнен.
//     # Отказ - Булево - Истина, если пользователь отменил операцию интерактивно.
//     # СертификатыШифрования = Строка - адрес временного хранилища, содержащего массив, описанный ниже.
//                             = Массив - помещается перед началом шифрования и после этого не изменяется.
//                                ## Значение - Структура
//                                   ### Отпечаток     - Строка - отпечаток сертификата в формате строки Base64.
//                                   ### Представление - Строка - сохраненное представление субъекта,
//                                                       полученное из двоичных данных сертификата.
//                                   ### Сертификат    - ДвоичныеДанные - содержит выгрузку сертификата,
//                                                       который использовался для шифрования.
//     # ЗашифрованныеДанные = ДвоичныеДанные - результат шифрования.
//                             При передаче параметра НаборДанных свойство нужно проверять в нем.
//                           = Строка - адрес временного хранилища, содержащего результат шифрования.
//
Процедура Зашифровать(ОписаниеДанных, Форма = Неопределено, ОбработкаРезультата = Неопределено) Экспорт
	
	КлиентскиеПараметры = Новый Структура;
	КлиентскиеПараметры.Вставить("ОписаниеДанных", ОписаниеДанных);
	КлиентскиеПараметры.Вставить("Форма", Форма);
	КлиентскиеПараметры.Вставить("ОбработкаРезультата", ОбработкаРезультата);
	
	ОбработкаЗавершения = Новый ОписаниеОповещения("СтандартноеЗавершение",
		ЭлектроннаяПодписьСлужебныйКлиент, КлиентскиеПараметры);
	
	Если ОписаниеДанных.Свойство("КонтекстОперации")
	   И ТипЗнч(ОписаниеДанных.КонтекстОперации) = Тип("ФормаКлиентскогоПриложения") Тогда
		
		ЭлектроннаяПодписьСлужебныйКлиент.ПродлитьХранениеКонтекстаОперации(ОписаниеДанных);
		НачалоИмениФормы = "Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Форма.";
		
		Если ОписаниеДанных.КонтекстОперации.ИмяФормы = НачалоИмениФормы + "ШифрованиеДанных" Тогда
			ОписаниеДанных.КонтекстОперации.ВыполнитьШифрование(КлиентскиеПараметры, ОбработкаЗавершения);
			Возврат;
		КонецЕсли;
	КонецЕсли;
	
	СерверныеПараметры = Новый Структура;
	СерверныеПараметры.Вставить("Операция",            НСтр("ru = 'Шифрование данных'"));
	СерверныеПараметры.Вставить("ЗаголовокДанных",     НСтр("ru = 'Данные'"));
	СерверныеПараметры.Вставить("НаборСертификатов");
	СерверныеПараметры.Вставить("ИзменятьНабор");
	СерверныеПараметры.Вставить("ВыполнятьНаСервере");
	ЗаполнитьЗначенияСвойств(СерверныеПараметры, ОписаниеДанных);
	
	ЭлектроннаяПодписьСлужебныйКлиент.ОткрытьНовуюФорму("ШифрованиеДанных",
		КлиентскиеПараметры, СерверныеПараметры, ОбработкаЗавершения);
	
КонецПроцедуры

// Расшифровывает данные, возвращает их и помещает в объект, если указано.
// 
// Общий подход к обработке значений свойств с типом ОписаниеОповещения в параметре ОписаниеДанных.
//  При выполнении обработки оповещения в нее передается структура параметров, в которой всегда есть
//  свойство "Оповещение" типа ОписаниеОповещения, обработку которого нужно выполнить для продолжения.
//  Кроме того, в структуре всегда есть свойство ОписаниеДанных, полученное при вызове процедуры.
//  При вызове оповещения в качестве значения должна передаваться структура. Если в процессе асинхронного
//  выполнения возникает ошибка, тогда в эту структуру нужно вставить свойство ОписаниеОшибки типа Строка.
// 
// Параметры:
//  ОписаниеДанных - Структура:
//    * Операция             - Строка - заголовок формы расшифровки данных, например, Расшифровка файла.
//    * ЗаголовокДанных      - Строка - заголовок элемента или набора данных, например Файл.
//    * СообщитьОЗавершении  - Булево - (необязательный) - если Ложь, то не будет показано оповещение о успешном
//                           завершении операции для представления данных, указанного рядом с заголовком.
//    * ОтборСертификатов    - Массив - (необязательный) - содержит ссылки на элементы справочника.
//                           СертификатыЭлектроннойПодписиИШифрования, которые могут быть выбраны
//                           пользователем. Отбор блокирует возможность выбора других сертификатов
//                           из личного хранилища.
//    * БезПодтверждения     - Булево - (необязательный) - пропустить подтверждение пользователя, если
//                           в свойстве ОтборСертификатов только один сертификат и:
//                           а) либо для сертификата указано "Вводить пароль в программе электронной подписи";
//                           б) либо пользователь запомнил пароль к сертификату на время сеанса;
//                           в) либо пароль установлен ранее методом УстановитьПарольСертификата.
//                           Если в процессе расшифровки возникла ошибка, тогда будет открыта форма
//                           с возможностью указать пароль.
//    * ЭтоАутентификация    - Булево - (необязательный) - если Истина, то вместо кнопки Расшифровать
//                           будет показана кнопка ОК. А также скорректированы некоторые надписи.
//                           Кроме того, параметр СообщитьОЗавершении устанавливается в Ложь.
//    * ПередВыполнением     - ОписаниеОповещения - (необязательный) - описание обработчика дополнительной
//                           подготовки данных после выбора сертификата, которым будут расшифрованы данные.
//                           В этом обработчике можно заполнить параметр Данные, если необходимо.
//                           В момент вызова в ОписаниеДанных уже вставлен выбранный сертификат,
//                           как ВыбранныйСертификат (смотри ниже). Следует учесть общий подход (смотри выше).
//    * ВыполнятьНаСервере   - Неопределено
//                           - Булево - (необязательный) - когда не указан или Неопределено,
//                           тогда выполнение будет определено автоматически: если есть сервер, то сначала
//                           на сервере, потом (при неудаче) на клиенте, потом сообщение о двух ошибках.
//                           Когда Истина: если разрешено выполнение на сервере, тогда выполнение
//                           только на сервере, при неудаче одно сообщение об ошибке на сервере.
//                           Когда Ложь: выполнение только на клиенте, как будто нет сервера.
//    * ПараметрыДополнительныхДействий - Произвольный - (необязательный) - если указан, то передается
//                           на сервер в процедуру ПередНачаломОперации общего модуля.
//                           ЭлектроннаяПодписьПереопределяемый, как ВходныеПараметры.
//    * КонтекстОперации     - Неопределено - (необязательный) - если указан, тогда в свойство будет
//                           установлено определенное значение произвольного типа, которое позволяет
//                           выполнить действие с тем же сертификатом повторно (у пользователя 
//                           не запрашивается ни пароль, ни подтверждение действия).
//                           В случае ошибки после вызова процедуры, повторное действие, выполненное
//                           с полученным контекстом, может быть также ошибочно.
//                           - Произвольный - (необязательный) - если определено, то действие будет выполнено
//                           с тем же сертификатом без запроса пароля или подтверждения.
//                           Параметр БезПодтверждения считается равным Истина.
//                           Параметры Операция, ЗаголовокДанных, ОтборСертификатов, ЭтоАутентификация
//                           и ВыполнятьНаСервере игнорируются, их значения остаются такими же, как при первом вызове.
//                           Параметр ПараметрыДополнительныхДействий игнорируется.
//                           Процедура ПередНачаломОперации не вызывается.
//                           Если передать контекст, возвращенный процедурой Подписать, тогда
//                           пароль, введенный для сертификата, может быть использован, как если бы
//                           пароль был сохранен на время сеанса. В остальном контекст игнорируется.
//    * ПрекратитьВыполнение - Произвольный - если свойство существует и в процессе асинхронного выполнения возникает
//                           ошибка, выполнение прекращается без отображения формы операции или с закрытием этой формы,
//                           если она была открыта.
// 
//    Вариант 1.
//    * Данные                - ДвоичныеДанные - данные для расшифровки.
//                            - Строка - адрес временного хранилища, содержащего двоичные данные.
//                            - ОписаниеОповещения - обработчик получения данных, который возвращает
//                            их в свойстве Данные (смотри выше общий подход). В момент вызова
//                            в ОписаниеДанных уже вставлен параметр ВыбранныйСертификат (смотри ниже).
//    * РазмещениеРезультата  - Неопределено - (необязательный) - описывает, куда поместить расшифрованные данные.
//                            Если не указан или Неопределено, тогда через параметр ОбработкаРезультата.
//                            - ОписаниеОповещения - обработчик сохранения расшифрованных данных.
//                            Следует учесть общий подход (смотри выше).
//                            В момент вызова в ОписаниеДанных уже вставлен параметр РасшифрованныеДанные.
//                            В случае параметра НаборДанных, в ОписаниеДанных вставляется
//                            свойство ТекущийЭлементНабораДанных, содержащее параметр РасшифрованныеДанные.
//    * Объект                - ЛюбаяСсылка - (необязательный) - ссылка на объект, который необходимо расшифровать,
//                            а также очистить записи из регистра сведений СертификатыШифрования
//                            после успешного завершения расшифровки.
//                            Если не указан, то сертификаты не требуется получать из объекта и очищать.
//                            - Строка - адрес временного хранилища, содержащий
//                              ## Массив из Структура - массив сертификатов шифрования
//                                 ### Отпечаток     - Строка - отпечаток сертификата в формате строки Base64.
//                                 ### Представление - Строка - сохраненное представление субъекта,
//                                                     полученное из двоичных данных сертификата.
//                                 ### Сертификат    - ДвоичныеДанные - содержит выгрузку сертификата,
//                                                     который использовался для шифрования.
//    * Представление       - ЛюбаяСсылка - (необязательный), если параметр не указан,
//                                  тогда представление вычисляется по значению свойства Объект.
//                          - Строка
//                          - Структура:
//                             ** Значение      - ЛюбаяСсылка
//                                              - ОписаниеОповещения - для открытия.
//                             ** Представление - Строка - представление значения.
// 
//    Вариант 2.
//    * НаборДанных           - Массив - структуры со свойствами, описанными в Варианте 1.
//    * ПредставлениеНабора   - Строка - представления нескольких элементов набора данных, например, "Файлы (%1)".
//                            В это представление в параметр %1 заполняется количество элементов.
//                            По гиперссылке можно открыть список.
//                            Если в наборе данных 1 элемент, тогда используется значение
//                            в свойстве Представление свойства НаборДанных, если не указано, тогда
//                            представление вычисляется по значению свойства Объект элемента набора данных.
//    * СписокПредставлений   - СписокЗначений
//                            - Массив - (необязательный) - произвольный список элементов
//                            или массив со значениями, как у свойства Представление, которые
//                            сможет открыть пользователь. Если не указан, то заполняется из
//                            свойств Представление или Объект в свойстве НаборДанных.
//    * СертификатыШифрования - Массив - (необязательный) значения, как у параметра Объект. Используется
//                            для извлечения списков сертификатов шифрования для элементов, указанных
//                            в параметре СписокПредставлений (порядок должен соответствовать).
//                            Когда указан, параметр Объект не используется.
//
//  Форма - ФормаКлиентскогоПриложения - форма, из которой нужно получить уникальный идентификатор, который будет
//        использоваться при помещении расшифрованных данных во временное хранилище.
//        - УникальныйИдентификатор - уникальный идентификатор, который будет использоваться
//        при помещении расшифрованных данных во временное хранилище.
//        - Неопределено - использовать стандартную форму.
//
//  ОбработкаРезультата - ОписаниеОповещения -
//     Требуется для нестандартной обработки результата, если не указан параметр Форма и/или РазмещениеРезультата.
//     В результат передается входной параметр ОписаниеДанных, который в успешном случае, дополняется свойствами:
//     # Успех - Булево - Истина, если все прошло успешно. Если Успех = Ложь, то частичное завершение
//               определяется по наличию свойства РасшифрованныеДанные. Если есть, то шаг выполнен.
//     # Отказ - Булево - Истина, если пользователь отменил операцию интерактивно.
//     # ВыбранныйСертификат - Структура - содержит свойства сертификата:
//         ## Ссылка    - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - ссылка на сертификат.
//         ## Отпечаток - Строка - отпечаток сертификата в формате строки Base64.
//         ## Данные    - Строка - адрес временного хранилища, содержащего двоичные данные сертификата.
//     # РасшифрованныеДанные = ДвоичныеДанные - результат расшифровки.
//                              При передаче параметра НаборДанных, свойство нужно проверять в нем.
//                            = Строка - адрес временного хранилища, содержащего результат расшифровки.
//
Процедура Расшифровать(ОписаниеДанных, Форма = Неопределено, ОбработкаРезультата = Неопределено) Экспорт
	
	КлиентскиеПараметры = Новый Структура;
	КлиентскиеПараметры.Вставить("ОписаниеДанных", ОписаниеДанных);
	КлиентскиеПараметры.Вставить("Форма", Форма);
	КлиентскиеПараметры.Вставить("ОбработкаРезультата", ОбработкаРезультата);
	
	ОбработкаЗавершения = Новый ОписаниеОповещения("СтандартноеЗавершение",
		ЭлектроннаяПодписьСлужебныйКлиент, КлиентскиеПараметры);
	
	Если ОписаниеДанных.Свойство("КонтекстОперации")
	   И ТипЗнч(ОписаниеДанных.КонтекстОперации) = Тип("ФормаКлиентскогоПриложения") Тогда
		
		ЭлектроннаяПодписьСлужебныйКлиент.ПродлитьХранениеКонтекстаОперации(ОписаниеДанных);
		НачалоИмениФормы = "Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Форма.";
		
		Если ОписаниеДанных.КонтекстОперации.ИмяФормы = НачалоИмениФормы + "РасшифровкаДанных" Тогда
			ОписаниеДанных.КонтекстОперации.ВыполнитьРасшифровку(КлиентскиеПараметры, ОбработкаЗавершения);
			Возврат;
		КонецЕсли;
		Если ОписаниеДанных.КонтекстОперации.ИмяФормы = НачалоИмениФормы + "ПодписаниеДанных" Тогда
			КлиентскиеПараметры.Вставить("УказанКонтекстДругойОперации");
		КонецЕсли;
	КонецЕсли;
	
	СерверныеПараметры = Новый Структура;
	СерверныеПараметры.Вставить("Операция",            НСтр("ru = 'Расшифровка данных'"));
	СерверныеПараметры.Вставить("ЗаголовокДанных",     НСтр("ru = 'Данные'"));
	СерверныеПараметры.Вставить("ОтборСертификатов");
	СерверныеПараметры.Вставить("СертификатыШифрования");
	СерверныеПараметры.Вставить("ЭтоАутентификация");
	СерверныеПараметры.Вставить("ВыполнятьНаСервере");
	СерверныеПараметры.Вставить("ПараметрыДополнительныхДействий");
	СерверныеПараметры.Вставить("РазрешитьЗапоминатьПароль");
	ЗаполнитьЗначенияСвойств(СерверныеПараметры, ОписаниеДанных);
	
	Если ОписаниеДанных.Свойство("Данные") Тогда
		Если ТипЗнч(СерверныеПараметры.СертификатыШифрования) <> Тип("Массив")
		   И ОписаниеДанных.Свойство("Объект") Тогда
			
			СерверныеПараметры.Вставить("СертификатыШифрования", ОписаниеДанных.Объект);
		КонецЕсли;
		
	ИначеЕсли ТипЗнч(СерверныеПараметры.СертификатыШифрования) <> Тип("Массив") Тогда
		
		СерверныеПараметры.Вставить("СертификатыШифрования", Новый Массив);
		Для каждого ЭлементДанных Из ОписаниеДанных.НаборДанных Цикл
			Если ЭлементДанных.Свойство("Объект") Тогда
				СерверныеПараметры.СертификатыШифрования.Добавить(ЭлементДанных.Объект);
			Иначе
				СерверныеПараметры.СертификатыШифрования.Добавить(Неопределено);
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	
	ЭлектроннаяПодписьСлужебныйКлиент.ОткрытьНовуюФорму("РасшифровкаДанных",
		КлиентскиеПараметры, СерверныеПараметры, ОбработкаЗавершения);
	
КонецПроцедуры

// Усовершенствует одну или несколько подписей до указанного типа.
//
// Параметры:
//  ОписаниеДанных - Структура:
//    * ТипПодписи          - ПеречислениеСсылка.ТипыПодписиКриптографии - тип подписи,
//                           до которого требуется усовершенствование. Если фактический ТипПодписи
//                           тот же или выше, тогда никаких действий произведено не будет.
//    * ДобавитьАрхивнуюМеткуВремени - Булево - если указано Истина и ТипПодписи указан архивная,
//                           и фактический ТипПодписи архивная, тогда будет добавлена метка времени.
//   
//    * Подпись             - ДвоичныеДанные - данные подписи.
//                          - Строка - адрес временного хранилища, содержащего двоичные данные.
//                          - Структура:
//                             ** ПодписанныйОбъект - ЛюбаяСсылка - ссылка на объект, подписи которого нужно усовершенствовать.
//                             ** ПорядковыйНомер - Число - порядковый номер подписи.
//                                                - Массив - значения указанного выше типа.
//                                                - Неопределено - все подписи объекта.
//                             ** Подпись - ДвоичныеДанные - (необязательный) данные подписи, если порядковый номер
//                                        подписи - число
//                                        - Строка - адрес временного хранилища, содержащего двоичные данные подписи,
//                                                         если порядковый номер подписи - число.
//                          - Массив из ДвоичныеДанные.
//                          - Массив из Строка - как для строки указанной выше.
//                          - Массив из Структура - как структура, указанная выше.
//   
//    * Представление       - ЛюбаяСсылка - (необязательный), если параметр не указан,
//                                  тогда представление вычисляется по значению свойств Объект и ПорядковыйНомер.
//                          - Строка
//                          - Структура:
//                             ** Значение      - ЛюбаяСсылка
//                                              - ОписаниеОповещения - для открытия.
//                             ** Представление - Строка - представление значения.
//                          - СписокЗначений
//                          - Массив - (необязательный) - произвольный список элементов
//                          или массив со значениями, как у описано выше, которые
//                          сможет открыть пользователь. Если не указан, то заполняется из
//                          свойств свойств Объект и ПорядковыйНомер.
//
//  Форма - ФормаКлиентскогоПриложения - форма, из которой нужно получить уникальный идентификатор,
//                                который будет использоваться при блокировке объекта.
//        - УникальныйИдентификатор - уникальный идентификатор, который будет
//                                использоваться при блокировке объекта.
//
//  ПрерыватьОбработкуМассиваПриОшибке  - Булево - по умолчанию Истина - при ошибке обработка следующих элементов будет прервана.
//  ИгнорироватьСрокДействияСертификата - Булево - по умолчанию Ложь -  не проверять срок действия сертификата подписи
//                                                 перед усовершенствованием.
//
//  ОбработкаРезультата - ОписаниеОповещения -
//     Требуется для нестандартной обработки результата, например, если не указана ссылка на объект и порядковый номер подписи.
//     Структура:
//     # Успех = Булево - Истина, если все прошло успешно. Если Успех = Ложь, то частичное завершение
//               определяется по наличию свойства СвойстваПодписи. Если есть, то шаг выполнен.
//     # ТекстОшибки = Строка
//     # СвойстваПодписей = Массив из Структура -
//                          ## Подпись = ДвоичныеДанные - Подпись, которую надо усовершенствовать.
//                                     = Строка - адрес во временном хранилище.
//                          ## ПодписанныйОбъект - ЛюбаяСсылка - если есть.
//                          ## ПорядковыйНомер - Число - если есть.
//                          ## ТипПодписи - ПеречислениеСсылка.ТипыПодписиКриптографии - тип подписи,
//                                если подпись не удалось усовершенствовать, но удалось определить тип.
//                          ## СрокДействияПоследнейМеткиВремени - Дата - срок действия,
//                                если подпись не удалось усовершенствовать, но удалось определить срок действия.
//                          ## СвойстваПодписи = см. ЭлектроннаяПодписьКлиентСервер.НовыеСвойстваПодписи -
//                             свойства усовершенствованной подписи (заполнены только изменившиеся).
//                          ## Ошибка = Строка - текст ошибки при попытке усовершенствования. Если произошла ошибка,
//                           то структура не будет содержать свойств подписи, которую не удалось усовершенствовать.
//                        = Строка - адрес временного хранилища, содержащего массив указанный выше.
//
Процедура УсовершенствоватьПодпись(ОписаниеДанных, Форма, ОбработкаРезультата = Неопределено,
	ПрерыватьОбработкуМассиваПриОшибке = Истина, ИгнорироватьСрокДействияСертификата = Ложь) Экспорт
	
	Контекст = Новый Структура;
	Контекст.Вставить("ОбработкаРезультата", ОбработкаРезультата);
	
	ПараметрыВыполнения = Новый Структура;
	ПараметрыВыполнения.Вставить("ОписаниеДанных",      ОписаниеДанных);
	Если ТипЗнч(Форма) = Тип("ФормаКлиентскогоПриложения") Тогда
		ПараметрыВыполнения.Вставить("ИдентификаторФормы", Форма.УникальныйИдентификатор);
	Иначе
		ПараметрыВыполнения.Вставить("ИдентификаторФормы", Форма);
	КонецЕсли;
	ПараметрыВыполнения.Вставить("ПрерыватьОбработкуМассиваПриОшибке",  ПрерыватьОбработкуМассиваПриОшибке);
	ПараметрыВыполнения.Вставить("ИгнорироватьСрокДействияСертификата", ИгнорироватьСрокДействияСертификата);
		
	Контекст.Вставить("ПараметрыВыполнения", ПараметрыВыполнения);
	
	ЭлектроннаяПодписьСлужебныйКлиент.УсовершенствоватьПодпись(Контекст);

КонецПроцедуры

// Проверяет действительность сертификата криптографии.
//
// Параметры:
//   Оповещение           - ОписаниеОповещения - оповещение о результате выполнения следующих типов
//             = Булево       - Истина, если проверка выполнена успешно.
//             = Строка       - описание ошибки проверки сертификата.
//             = Неопределено - не удалось получить менеджер криптографии (когда не указан).
//
//   Сертификат           - СертификатКриптографии - сертификат.
//                        - ДвоичныеДанные - двоичные данные сертификата.
//                        - Строка - адрес временного хранилища, содержащего двоичные данные сертификата.
//
//   МенеджерКриптографии - Неопределено - получить менеджер криптографии автоматически.
//                        - МенеджерКриптографии - использовать указанный менеджер криптографии
//                          (проверка на сервере не будет выполнена).
//
//   НаДату               - Дата - проверить сертификат на указанную дату.
//                          Если параметр не указан или указана пустая дата,
//                          тогда проверять на текущую дату сеанса.
//
Процедура ПроверитьСертификат(Оповещение, Сертификат, МенеджерКриптографии = Неопределено, НаДату = Неопределено) Экспорт
	
	ЭлектроннаяПодписьСлужебныйКлиент.ПроверитьСертификат(Оповещение, Сертификат, МенеджерКриптографии, НаДату);
	
КонецПроцедуры

// Открывает форму ПроверкаСертификата и возвращает результат проверки.
//
// Параметры:
//  Сертификат - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - проверяемый сертификат.
//
//  ДополнительныеПараметры - Неопределено - обычная проверка сертификата.
//                          - Структура - с необязательными свойствами:
//    * ВладелецФормы          - ФормаКлиентскогоПриложения - другая форма.
//    * ЗаголовокФормы         - Строка - если указан, тогда заменяет заголовок формы.
//    * ПроверкаПриВыборе      - Булево - если Истина, тогда кнопка Проверить будет называться
//                             "Проверить и продолжить", а кнопка Закрыть будет называться "Отмена".
//    * ОбработкаРезультата    - ОписаниеОповещения - вызывается сразу после проверки, в процедуру
//                             передается Результат.ПроверкиПройдены (смотри ниже) с начальным значением Ложь.
//                             В режиме ПроверкаПриВыборе, если не установить Истина,
//                             форма не будет закрыта после возврата из процедуры оповещения и
//                             будет показано предупреждение о невозможности продолжения.
//    * БезПодтверждения       - Булево - если установить Истина, тогда при наличии пароля
//                             проверка будет выполнена сразу без открытия формы.
//                             Если режим ПроверкаПриВыборе и установлен параметр ОбработкаРезультата, то
//                             форма не будет открыта, если параметр ПроверкиПройдены установлен Истина.
//    * ОбработкаЗавершения    - ОписаниеОповещения - вызывается при закрытии формы, в качестве результата
//                             передается Неопределено или значение ПроверкиПройдены (смотри ниже).
//    * КонтекстОперации       - Произвольный - если передать контекст, возвращенный процедурами Подписать,
//                             Расшифровать и т.д., пароль, введенный для сертификата, может быть использован,
//                             как если бы он был сохранен на время сеанса.
//                             При повторном вызове параметр БезПодтверждения считается равным Истина.
//    * НеПоказыватьРезультаты - Булево - если параметр принимает значение Истина и параметр КонтекстОперации
//                             содержит контекст предыдущей операции, результаты проверки не будут показаны
//                             пользователю.
//    * Результат              - Неопределено - проверка ни разу не выполнялась.
//                             - Структура - возвращаемое значение. Вставляется перед обработкой результата:
//         * ПроверкиПройдены  - Булево - возвращаемое значение. Устанавливается в процедуре параметра ОбработкаРезультата.
//         * ПроверкиНаСервере - Неопределено - проверка не выполнялась на сервере:
//                             - Структура - со свойствами, как в следующем параметре.
//         * ПроверкиНаКлиенте - Структура:
//             * НаличиеСертификата  - Булево
//                                   - Неопределено - если Истина, тогда проверка прошла успешно,
//                                     если Ложь - проверка прошла не успешно, если Неопределено - не выполнялась.
//                                     Если стандартные проверки скрыты в процедуре ПриСозданииФормыПроверкаСертификата,
//                                     общего модуля ЭлектроннаяПодписьПереопределяемый, тогда свойства нет.
//             * ДанныеСертификата   - Булево
//                                   - Неопределено - так же, как указано выше.
//             * НаличиеПрограммы    - Булево
//                                   - Неопределено - так же, как указано выше.
//             * Подписание          - Булево
//                                   - Неопределено - так же, как указано выше.
//             * ПроверкаПодписи     - Булево
//                                   - Неопределено - так же, как указано выше.
//             * Шифрование          - Булево
//                                   - Неопределено - так же, как указано выше.
//             * Расшифровка         - Булево
//                                   - Неопределено - так же, как указано выше.
//             <Имя дополнительной проверки> имя дополнительной проверки, определенной
//                                     в общем модуле ПриСозданииФормыПроверкаСертификата
//                                     с типами, как указано выше.
//             <Имя дополнительной проверки>Ошибка имя дополнительной проверки с окончанием Ошибка и
//                                    типом Строка (содержит текст ошибки, если проверка имеет значение Ложь).
//
//    * ПараметрыДополнительныхПроверок - Произвольный - параметры, которые передаются в процедуру
//        ПриСозданииФормыПроверкаСертификата общего модуля ЭлектроннаяПодписьПереопределяемый.
//
Процедура ПроверитьСертификатСправочника(Сертификат, ДополнительныеПараметры = Неопределено) Экспорт
	
	ЭлектроннаяПодписьСлужебныйКлиент.ПроверитьСертификатСправочника(Сертификат, ДополнительныеПараметры);
	
КонецПроцедуры

// Показывает диалог установки расширения для работы с электронной подписью и шифрованием.
// Только для работы через средства платформы (МенеджерКриптографии).
//
// Параметры:
//   БезВопроса - Булево - если указано Истина, тогда вопроса показано не будет.
//                Требуется, если пользователь нажал на кнопку Установить расширение.
//
//   ОбработчикРезультата - ОписаниеОповещения - описание процедуры, принимающей результат выбора
//      РасширениеУстановлено типов:
//       = Булево
//          Истина - Пользователь подтвердил установку, после установки расширение было успешно подключено.
//          Ложь   - Пользователь подтвердил установку, однако после установки расширение не удалось подключить.
//       = Неопределено - Пользователь отказался от установки.
//
//   ТекстВопроса     - Строка - текст вопроса.
//   ЗаголовокВопроса - Строка - заголовок вопроса.
//
//
Процедура УстановитьРасширение(БезВопроса, ОбработчикРезультата = Неопределено, ТекстВопроса = "", ЗаголовокВопроса = "") Экспорт
	
	ЭлектроннаяПодписьСлужебныйКлиент.УстановитьРасширение(БезВопроса, ОбработчикРезультата, ТекстВопроса, ЗаголовокВопроса);
	
КонецПроцедуры

// Открывает или активизирует форму настроек электронной подписи и шифрования.
// 
// Параметры:
//  Страница - Строка - допустимы строки "Сертификаты", "Настройки", "Программы".
//
Процедура ОткрытьНастройкиЭлектроннойПодписиИШифрования(Страница = "Сертификаты") Экспорт
	
	ПараметрыФормы = Новый Структура;
	Если Страница = "Сертификаты" Тогда
		ПараметрыФормы.Вставить("ПоказатьСтраницуСертификаты");
		
	ИначеЕсли Страница = "Настройки" Тогда
		ПараметрыФормы.Вставить("ПоказатьСтраницуНастройки");
		
	ИначеЕсли Страница = "Программы" Тогда
		ПараметрыФормы.Вставить("ПоказатьСтраницуПрограммы");
	КонецЕсли;
	
	Форма = ОткрытьФорму("ОбщаяФорма.НастройкиЭлектроннойПодписиИШифрования", ПараметрыФормы);
	
	// При повторном открытии формы требуются дополнительные действия.
	Если Страница = "Сертификаты" Тогда
		Форма.Элементы.Страницы.ТекущаяСтраница = Форма.Элементы.СтраницаСертификаты;
		
	ИначеЕсли Страница = "Настройки" Тогда
		Форма.Элементы.Страницы.ТекущаяСтраница = Форма.Элементы.СтраницаНастройки;
		
	ИначеЕсли Страница = "Программы" Тогда
		Форма.Элементы.Страницы.ТекущаяСтраница = Форма.Элементы.СтраницаПрограммы;
	КонецЕсли;
	
	Форма.Открыть();
	
КонецПроцедуры

// Открывает ссылку на раздел ИТС "Инструкции по работе с программами электронной подписи и шифрования".
//
Процедура ОткрытьИнструкциюПоРаботеСПрограммами() Экспорт
	
	ЭлектроннаяПодписьСлужебныйКлиент.ОткрытьИнструкциюПоРаботеСПрограммами();
	
КонецПроцедуры

// Открывает инструкцию с описанием типичных проблем при работе с программами
// электронной подписи и вариантами их решения.
//
// Параметры:
//   ИмяРаздела - Строка - ссылка на ошибку в инструкции.
//
Процедура ОткрытьИнструкциюПоТипичнымПроблемамПриРаботеСПрограммами(ИмяРаздела = "") Экспорт
	
	НавигационнаяСсылка = "";
	ЭлектроннаяПодписьКлиентСерверЛокализация.ПриОпределенииСсылкиНаИнструкциюПоТипичнымПроблемамПриРаботеСПрограммами(
		НавигационнаяСсылка, ИмяРаздела);
	
	Если Не ПустаяСтрока(НавигационнаяСсылка) Тогда
		ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(НавигационнаяСсылка);
	КонецЕсли;
	
КонецПроцедуры

// Возвращает дату, извлеченную из двоичных данных подписи, или Неопределено.
//
// Параметры:
//  Оповещение - ОписаниеОповещения - вызывается для передачи возвращаемого значения типов:
//                 = Дата - успешно извлеченная дата подписи,
//                 = Неопределено - не удалось извлечь дату из данных подписи.
//  Подпись - ДвоичныеДанные - данные подписи, из которых нужно извлечь дату.
//  ПривестиКЧасовомуПоясуСеанса - Булево - привести универсальное время к времени сеанса.
//
Процедура ДатаПодписания(Оповещение, Подпись, ПривестиКЧасовомуПоясуСеанса = Истина) Экспорт
	
	ДатаПодписания = ЭлектроннаяПодписьСлужебныйКлиентСервер.ДатаПодписанияУниверсальная(Подпись);
	
	Если ДатаПодписания = Неопределено Тогда
		ВыполнитьОбработкуОповещения(Оповещение, Неопределено);
		Возврат;
	КонецЕсли;
	
	Если ПривестиКЧасовомуПоясуСеанса Тогда
		ДатаПодписания = ДатаПодписания + (ОбщегоНазначенияКлиент.ДатаСеанса()
			- ОбщегоНазначенияКлиент.ДатаУниверсальная());
	КонецЕсли;
	
	ВыполнитьОбработкуОповещения(Оповещение, ДатаПодписания);
	
КонецПроцедуры
	
// Возвращает представление сертификата в справочнике, формируемое
// из представления субъекта (КомуВыдан) и срока действия сертификата.
//
// Параметры:
//   Сертификат   - СертификатКриптографии - сертификат криптографии.
//                - Структура:
//                   * ДействителенДо - см. ЭлектроннаяПодпись.СвойстваСертификата.ДействителенДо
//                   * Сертификат   - СертификатКриптографии - сертификат криптографии.
//
// Возвращаемое значение:
//  Строка - представление сертификата в справочнике.
//
Функция ПредставлениеСертификата(Сертификат) Экспорт
	
	Возврат ЭлектроннаяПодписьСлужебныйКлиентСервер.ПредставлениеСертификата(Сертификат,
		ЭлектроннаяПодписьСлужебныйКлиент.ДобавкаВремени());
	
КонецФункции

// Возвращает представление субъекта сертификата (КомуВыдан).
//
// Параметры:
//   Сертификат - СертификатКриптографии - сертификат криптографии.
//
// Возвращаемое значение:
//   Строка   - представление субъекта в формате "Фамилия Имя, Организация, Подразделение, Должность".
//              Если ФИО не удалось определить, тогда оно заменяется на ОбщееИмя.
//              Организация, Подразделение и Должность могут отсутствовать, если не указаны или
//              их не удалось определить.
//
Функция ПредставлениеСубъекта(Сертификат) Экспорт
	
	Возврат ЭлектроннаяПодписьСлужебныйКлиентСервер.ПредставлениеСубъекта(Сертификат);
	
КонецФункции

// Возвращает представление издателя сертификата (КемВыдан).
//
// Параметры:
//   Сертификат - СертификатКриптографии - сертификат криптографии.
//
// Возвращаемое значение:
//   Строка - представление издателя в формате "ОбщееИмя, Организация, Подразделение",
//            Организация и Подразделение могут отсутствовать, если не указаны.
//
Функция ПредставлениеИздателя(Сертификат) Экспорт
	
	Возврат ЭлектроннаяПодписьСлужебныйКлиентСервер.ПредставлениеИздателя(Сертификат);
	
КонецФункции

// Возвращает основные свойства сертификата в виде структуры.
//
// Параметры:
//   Сертификат - СертификатКриптографии - сертификат криптографии.
//
// Возвращаемое значение:
//   Структура:
//    * Отпечаток      - Строка - отпечаток сертификата в формате строки Base64.
//    * СерийныйНомер  - ДвоичныеДанные - свойство сертификата СерийныйНомер.
//    * Представление  - см. ЭлектроннаяПодписьКлиент.ПредставлениеСертификата.
//    * КомуВыдан      - см. ЭлектроннаяПодписьКлиент.ПредставлениеСубъекта.
//    * КемВыдан       - см. ЭлектроннаяПодписьКлиент.ПредставлениеИздателя.
//    * ДатаНачала     - Дата   - свойство сертификата ДатаНачала в часовом поясе сеанса.
//    * ДатаОкончания  - Дата   - свойство сертификата ДатаОкончания в часовом поясе сеанса.
//    * Назначение     - Строка - описание расширенного свойства сертификата EKU.
//    * Подписание     - Булево - свойство сертификата ИспользоватьДляПодписи.
//    * Шифрование     - Булево - свойство сертификата ИспользоватьДляШифрования.
//
Функция СвойстваСертификата(Сертификат) Экспорт
	
	Возврат ЭлектроннаяПодписьСлужебныйКлиентСервер.СвойстваСертификата(Сертификат,
		ЭлектроннаяПодписьСлужебныйКлиент.ДобавкаВремени(), Неопределено);
	
КонецФункции

// Возвращает свойства субъекта сертификата криптографии.
//
// Параметры:
//   Сертификат - СертификатКриптографии - для которого нужно вернуть свойства субъекта.
//
// Возвращаемое значение:
//  Структура - со свойствами, состав которых зависит от национальной специфики. Пример для Российской Федерации:
//     * ОбщееИмя         - Строка - (64) - извлекается из поля CN.
//                          ЮЛ - в зависимости от типа конечного владельца СКПЭП
//                              а) наименование организации;
//                              б) название автоматизированной системы;
//                              в) другое отображаемое имя по требованиям информационной системы.
//                          ФЛ - ФИО.
//                        - Неопределено - такое свойство сертификата отсутствует.
//
//     * Страна           - Строка - (2) - извлекается из поля C - двухсимвольный код страны
//                          согласно ИСО 3166-1:1997 (ГОСТ 7.67-2003).
//                        - Неопределено - свойство сертификата не существует.
//
//     * Регион           - Строка - (128) - извлекается из поля S - наименование субъекта РФ.
//                          ЮЛ - по адресу местонахождения.
//                          ФЛ - по адресу регистрации.
//                        - Неопределено - такое свойство сертификата отсутствует.
//
//     * НаселенныйПункт  - Строка - (128) - извлекается из поля L - наименование населенного пункта.
//                          ЮЛ - по адресу местонахождения.
//                          ФЛ - по адресу регистрации.
//                        - Неопределено - такое свойство сертификата отсутствует.
//
//     * Улица            - Строка - (128) - извлекается из поля Street - наименование улицы, дома, офиса.
//                          ЮЛ - по адресу местонахождения.
//                          ФЛ - по адресу регистрации.
//                        - Неопределено - такое свойство сертификата отсутствует.
//
//     * Организация      - Строка - (64) - извлекается из поля O.
//                          ЮЛ - полное или сокращенное наименование организации.
//                        - Неопределено - такое свойство сертификата отсутствует.
//
//     * Подразделение    - Строка - (64) - извлекается из поля OU.
//                          ЮЛ - в случае выпуска СКПЭП на должностное лицо - подразделение организации.
//                              Подразделение - это территориальная структурная единица крупной организации,
//                              которое обычно не заполняется в сертификате.
//                        - Неопределено - такое свойство сертификата отсутствует.
//
//     * ЭлектроннаяПочта - Строка - (128) - извлекается из поля E - адрес электронной почты.
//                          ЮЛ - адрес электронной почты должностного лица.
//                          ФЛ - адрес электронной почты физического лица.
//                        - Неопределено - такое свойство сертификата отсутствует.
//
//     * Должность        - Строка - (64) - извлекается из поля T.
//                          ЮЛ - в случае выпуска СКПЭП на должностное лицо - его должность.
//                        - Неопределено - такое свойство сертификата отсутствует.
//
//     * ОГРН             - Строка - (13) - извлекается из поля OGRN.
//                          ЮЛ - ОГРН организации.
//                        - Неопределено - такое свойство сертификата отсутствует.
//
//     * ОГРНИП           - Строка - (15) - извлекается из поля OGRNIP.
//                          ИП - ОГРН индивидуального предпринимателя.
//                        - Неопределено - такое свойство сертификата отсутствует.
//
//     * СНИЛС            - Строка - (11) - извлекается из поля SNILS.
//                          ФЛ - СНИЛС
//                          ЮЛ - не обязательно, в случае выпуска СКПЭП на должностное лицо - его СНИЛС.
//                        - Неопределено - такое свойство сертификата отсутствует.
//
//     * ИНН              - Строка - (12) - извлекается из поля INN.
//                          ФЛ - ИНН.
//                          ИП - ИНН.
//                          ЮЛ - не обязательно, но может быть заполнен в старых сертификатах.
//                        - Неопределено - такое свойство сертификата отсутствует.
//
//     * ИННЮЛ            - Строка - (10) - извлекается из поля INNLE.
//                          ЮЛ - обязательно, но может отсутствовать в старых сертификатах.
//                        - Неопределено - такое свойство сертификата отсутствует.
//
//     * Фамилия          - Строка - (64) - извлекается из поля SN, если заполнено.
//                        - Неопределено - такое свойство сертификата отсутствует.
//
//     * Имя              - Строка - (64) - извлекается из поля GN, если заполнено.
//                        - Неопределено - такое свойство сертификата отсутствует.
//
//     * Отчество         - Строка - (64) - извлекается из поля GN, если заполнено.
//                        - Неопределено - такое свойство сертификата отсутствует.
//
Функция СвойстваСубъектаСертификата(Сертификат) Экспорт
	
	Возврат ЭлектроннаяПодписьСлужебныйКлиентСервер.СвойстваСубъектаСертификата(Сертификат);
	
КонецФункции

// Возвращает свойства издателя сертификата криптографии. 
//
// Параметры:
//   Сертификат - СертификатКриптографии - для которого нужно вернуть свойства издателя.
//
// Возвращаемое значение:
//  Структура - со свойствами, состав которых зависит от национальной специфики.
//              Пример для Российской Федерации:
//     * ОбщееИмя         - Строка - (64) - извлекается из поля CN - псевдоним удостоверяющего центра.
//                        - Неопределено - такое свойство сертификата отсутствует.
//
//     * Страна           - Строка - (2) - извлекается из поля C - двухсимвольный код страны
//                          согласно ИСО 3166-1:1997 (ГОСТ 7.67-2003).
//                        - Неопределено - такое свойство сертификата отсутствует.
//
//     * Регион           - Строка - (128) - извлекается из поля S - наименование субъекта РФ
//                          по адресу местонахождения ПАК УЦ.
//                        - Неопределено - такое свойство сертификата отсутствует.
//
//     * НаселенныйПункт  - Строка - (128) - извлекается из поля L - наименование населенного пункта
//                          по адресу местонахождения ПАК УЦ.
//                        - Неопределено - такое свойство сертификата отсутствует.
//
//     * Улица            - Строка - (128) - извлекается из поля Street - наименование улицы, дома, офиса
//                          по адресу местонахождения ПАК УЦ.
//                        - Неопределено - такое свойство сертификата отсутствует.
//
//     * Организация      - Строка - (64) - извлекается из поля O - полное или сокращенное наименование организации.
//                        - Неопределено - такое свойство сертификата отсутствует.
//
//     * Подразделение    - Строка - (64) - извлекается из поля OU - подразделение организации.
//                            Подразделение - это территориальная структурная единица крупной организации,
//                            которое обычно не заполняется в сертификате.
//                        - Неопределено - такое свойство сертификата отсутствует.
//
//     * ЭлектроннаяПочта - Строка - (128) - извлекается из поля E - адрес электронной почты удостоверяющего центра.
//                        - Неопределено - такое свойство сертификата отсутствует.
//
//     * ОГРН             - Строка - (13) - извлекается из поля OGRN - ОГРН организации удостоверяющего центра.
//                        - Неопределено - такое свойство сертификата отсутствует.
//
//     * ИНН              - Строка - (12) - извлекается из поля INN - ИНН организации удостоверяющего центра.
//                          ЮЛ - необязательно, но может присутствовать в старых сертификатах.
//                        - Неопределено - такое свойство сертификата отсутствует.
//
//     * ИННЮЛ            - Строка - (10) - извлекается из поля INNLE - ИНН организации удостоверяющего центра.
//                          ЮЛ - обязательно, но может отсутствовать в старых сертификатах.
//                        - Неопределено - такое свойство сертификата отсутствует.
//
Функция СвойстваИздателяСертификата(Сертификат) Экспорт
	
	Возврат ЭлектроннаяПодписьСлужебныйКлиентСервер.СвойстваИздателяСертификата(Сертификат);
	
КонецФункции

// Возвращает шаблон формата XML, содержащий один стандартный элемент
// Signature (см. стандарт https://www.w3.org/TR/xmldsig-core1)
// с одним элементом Reference и заполненным атрибутом URI
// (ссылка на сообщение XML, которое будет подписано).
//
// Возвращаемый шаблон содержит параметры %SignatureMethod%, %DigestMethod%,
// %DigestValue%, %SignatureValue%, %BinarySecurityToken%,
// которые автоматически заполняются при подписании.
// Параметры %SignatureMethod% (алгоритм подписи в формате xml) и
// %DigestMethod% (алгоритм хеширования в формате xml) вычисляются по
// алгоритму открытого ключа сертификата, которым выполняется подписание,
// сначала по таблице, указанной в ПараметрыXMLDSig, затем
// если таблица не заполнена или соответствие не найдено,
// по внутренней таблице соответствия (рекомендуется).
// 
// Поддерживаются также шаблоны с несколькими элементами Signature
// и несколькими элементами Reference.
// Подпись будет добавлена в первый найденный элемент Signature, не содержащий значение подписи.
//
// Поддерживаются алгоритмы подписания и хеширования ГОСТ 94…2012.
// Поддерживаются алгоритмы канонизации:
//  Exclusive XML Canonicalization 1.0
//   http://www.w3.org/2001/10/xml-exc-c14n#
//   http://www.w3.org/2001/10/xml-exc-c14n#WithComments
//  Canonical XML 1.0
//   http://www.w3.org/TR/2001/REC-xml-c14n-20010315
//   http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments
//  Canonical XML 1.1
//   http://www.w3.org/2006/12/xml-c14n11
//   http://www.w3.org/2006/12/xml-c14n11#WithComments
//  Enveloped signature (по факту игнорируется, так как
//  не поддерживается пустой URI в элементе SignedInfo.Reference):
//   http://www.w3.org/2000/09/xmldsig#enveloped-signature
//  СМЭВ рекомендации 3.5.0.1, "АЛГОРИТМ трансформации XML":
//   urn://smev-gov-ru/xmldsig/transform
//
// Сертификат может быть указан в KeyInfo, как base64 значение:
// - либо в виде элемента X509Data.X509Certificate
// - либо в виде элемента KeyInfoReference.Reference или
//   SecurityTokenReference.Reference с URI на элемент со значением.
//
// Параметры:
//  Параметры - см. ЭлектроннаяПодписьКлиент.ПараметрыКонвертаXML
//            - Неопределенно - использовать параметры по умолчанию.
//
// Возвращаемое значение:
//  Строка
//
// Пример:
//	ПараметрыКонверта = ЭлектроннаяПодписьКлиент.ПараметрыКонвертаXML();
//	ПараметрыКонверта.Вариант = "furs.mark.crpt.ru_v1";
//	ПараметрыКонверта.СообщениеXML =
//	"    <getProductDetailsResponse xmlns=""http://warehouse.example.com/ws"">
//	|      <getProductDetailsResult>
//	|       <productID>12345</productID>
//	|       <productName>Стакан граненый</productName>
//	|       <description>Стакан граненый. 250 мл.</description>
//	|       <price>9.95</price>
//	|       <currency>
//	|         <code>840</code>
//	|         <alpha3>USD</alpha3>
//	|         <sign>$</sign>
//	|         <name>US dollar</name>
//	|         <accuracy>2</accuracy>
//	|       </currency>
//	|       <inStock>true</inStock>
//	|     </getProductDetailsResult>
//	|   </getProductDetailsResponse>";
//	
//	КонвертXML = ЭлектроннаяПодписьКлиент.КонвертXML(Параметры);
//
Функция КонвертXML(Параметры = Неопределено) Экспорт
	
	Возврат ЭлектроннаяПодписьСлужебныйКлиентСервер.КонвертXML(Параметры);
	
КонецФункции

// Возвращает параметры, которые можно задать для конверта XML.
//
// Возвращаемое значение:
//  Структура:
//   * Вариант - Строка - вариант типового шаблона XML для обмена с сервисом:
//                 "furs.mark.crpt.ru_v1" (начальное значение) или "dmdk.goznak.ru_v1".
//                 Возможны другие форматы, если удовлетворяют требованиям,
//                 указанным в описании функции КонвертXML.
//
//   * СообщениеXML - Строка - сообщение в формате XML, которое вставлено в шаблон.
//                             Если не заполнено, остается параметр %MessageXML%.
//
Функция ПараметрыКонвертаXML() Экспорт
	
	Возврат ЭлектроннаяПодписьСлужебныйКлиентСервер.ПараметрыКонвертаXML();
	
КонецФункции

// Формирует структуру свойств для настройки нестандартной обработки
// конверта XML и алгоритмов подписания и хеширования.
//
// Рекомендуется не заполнять параметры XPathSignedInfo и XPathПодписываемыйТег
// Параметр XPathSignedInfo вычисляется по алгоритмам канонизации,
// а параметр XPathПодписываемыйТег вычисляется по ссылке
// в атрибуте URI элемента SignedInfo.Reference конверта XML.
// Параметры оставлены для обратной совместимости. Если указаны, работает по-старому:
// не выполняется извлечение параметров из конверта XML и их контроль, при этом
// конверт должен содержать алгоритмы канонизации и иметь элементы
// размещения сертификата, как в варианте конверта "furs.mark.crpt.ru_v1".
//
// Не требуется заполнять алгоритмы для использования сертификатов
// с алгоритмами открытого ключа ГОСТ 94, ГОСТ 2001, ГОСТ 2012/256 и ГОСТ 2012/512.
// Алгоритмы подписания и хеширования вычисляются по алгоритму открытого ключа,
// извлекаемого из сертификата, которым выполняется подписание. Сначала
// по переданной таблице, затем если таблица не заполнена или соответствие
// не найдено, по внутренней таблице соответствия (рекомендуется).
//
// Возвращаемое значение:
//  Структура:
//   * XPathSignedInfo         - Строка - по умолчанию: "(//. | //@* | //namespace::*)[ancestor-or-self::*[local-name()='SignedInfo']]".
//   * XPathПодписываемыйТег   - Строка - по умолчанию: "(//. | //@* | //namespace::*)[ancestor-or-self::soap:Body]".
//
//   * OIDАлгоритмаОткрытогоКлюча - Строка - например, "1.2.643.2.2.19"    + Символы.ПС + "1.2.643.7.1.1.1.1" + ...
//   * ИмяАлгоритмаПодписи        - Строка - например, "GOST R 34.10-2001" + Символы.ПС + "GOST R 34.11-2012" + ...
//   * OIDАлгоритмаПодписи        - Строка - например, "1.2.643.2.2.3"     + Символы.ПС + "1.2.643.7.1.1.3.2" + ...
//   * ИмяАлгоритмаХеширования    - Строка - например, "GOST R 34.11-94"   + Символы.ПС + "GOST R 34.11-12"   + ...
//   * OIDАлгоритмаХеширования    - Строка - например, "1.2.643.2.2.9"     + Символы.ПС + "1.2.643.7.1.1.2.2" + ...
//   * АлгоритмПодписи            - Строка - например, "http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"
//                                      + Символы.ПС +
//                                      "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256" + ...
//   * АлгоритмХеширования        - Строка - например, "http://www.w3.org/2001/04/xmldsig-more#gostr3411"
//                                      + Символы.ПС + "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256" + ...
//
Функция ПараметрыXMLDSig() Экспорт
	
	Возврат ЭлектроннаяПодписьСлужебныйКлиентСервер.ПараметрыXMLDSig();
	
КонецФункции

// Формирует структуру свойств для подписания данных в формате CMS.
// 
// Возвращаемое значение:
//  Структура:
//   * ТипПодписи                    - Строка - "CAdES-BES" - остальные варианты пока не используются.
//   * Открепленная                  - Булево -  Ложь (по умолчанию) - включать данные в контейнер подписи.
//                                   Истина - не включать данные в контейнер подписи.
//   * ВключениеСертификатовВПодпись - РежимВключенияСертификатовКриптографии - определяет длину цепочки
//                                   сертификатов, включаемых в подпись. Значение ВключатьЦепочкуБезКорневого
//                                   не поддерживается и считается равным значению ВключатьПолнуюЦепочку.
//
Функция ПараметрыCMS() Экспорт
	
	Возврат ЭлектроннаяПодписьСлужебныйКлиентСервер.ПараметрыCMS();
	
КонецФункции

#Область ЗаписьСертификатаВСправочник

// Инициализирует структуру параметров для добавления сертификата
// в справочник СертификатыКлючейЭлектроннойПодписиИШифрования.
// Для использования в процедуре ЗаписатьСертификатВСправочник.
//
// Возвращаемое значение:
//   Структура:
//      * Наименование  - Строка - представление сертификата в списке.
//                      Значение по умолчанию - "".
//      * Пользователь  - СправочникСсылка.Пользователи - пользователь, которому принадлежит сертификат.
//                      Значение используется при получении списка личных сертификатов пользователя
//                      в формах подписания и шифрования данных.
//                      Значение по умолчанию - Неопределено.
//      * Организация   - ОпределяемыйТип.Организация - организация, к которой относится сертификат.
//                      Значение по умолчанию - Неопределено.
//      * Программа     - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования - программа, которая
//                      требуется для подписания и расшифровки.
//                      Значение по умолчанию - Неопределено.
//      * ВводитьПарольВПрограммеЭлектроннойПодписи - Булево - флажок "Вводить пароль в программе электронной подписи",
//                      требуется Истина, когда сертификат был установлен на компьютере с усиленной
//                      защитой закрытого ключа, которая означает поддержку только пустого пароля на
//                      уровне 1С:Предприятия (пароль у пользователя не запрашивается - это делает
//                      операционная система, которая не принимает от 1С:Предприятия непустой пароль).
//                      Значение по умолчанию - Ложь.
//
Функция ПараметрыЗаписиСертификата() Экспорт
	
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("Наименование", "");
	ДополнительныеПараметры.Вставить("Пользователь", Неопределено);
	ДополнительныеПараметры.Вставить("Организация", Неопределено);
	ДополнительныеПараметры.Вставить("Программа", Неопределено);
	ДополнительныеПараметры.Вставить("ВводитьПарольВПрограммеЭлектроннойПодписи", Ложь);
	
	Возврат ДополнительныеПараметры;
	
КонецФункции

// Осуществляет проверку сертификата и, в случае успеха, добавляет новый или обновляет существующий сертификат
// в справочнике СертификатыКлючейЭлектроннойПодписиИШифрования. Если проверка не пройдена, показывает
// информацию о возникших ошибках.
// Для добавления сертификата на сервере смотри ЭлектроннаяПодпись.ЗаписатьСертификатВСправочник.
//
// Параметры:
//   ОбработчикЗавершения - ОписаниеОповещения - вызывается после добавления сертификата
//                           для передачи возвращаемого значения типов:
//       = Неопределено - при проверке или добавлении сертификата произошла ошибка.
//       = СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - добавленный сертификат.
//   Сертификат              - ДвоичныеДанные - двоичные данные сертификата.
//                           - Строка - двоичные данные сертификата электронной подписи или
//                           адрес данных во временном хранилище.
//   ПарольСертификата       - Строка - пароль сертификата для проверки операций с закрытым ключом.
//   ДляШифрования           - Булево - определяет состав проверок,
//                           выполняемых перед добавлением сертификата. Если параметр принимает значение Истина,
//                           выполняется проверка шифрования и расшифровки, иначе - подписания и проверки подписи.
//   ДополнительныеПараметры - Неопределено - без дополнительных параметров.
//                           - см. ПараметрыЗаписиСертификата
//
Процедура ЗаписатьСертификатВСправочник(ОбработчикЗавершения,
	Сертификат,
	ПарольСертификата,
	ДляШифрования = Ложь,
	ДополнительныеПараметры = Неопределено) Экспорт
	
	Контекст = Новый Структура;
	Контекст.Вставить("ПарольСертификата", ПарольСертификата);
	Контекст.Вставить("ДляШифрования", ДляШифрования);
	Контекст.Вставить("ДополнительныеПараметры", ?(ДополнительныеПараметры = Неопределено,
		ПараметрыЗаписиСертификата(), ДополнительныеПараметры));
	Контекст.Вставить("ЗаголовокФормы", ?(Контекст.ДляШифрования = Истина,
		НСтр("ru = 'Не удалось проверить шифрование и расшифровку'"),
		НСтр("ru = 'Не удалось проверить установку электронной подписи'")));
	Контекст.Вставить("ЗаголовокОшибкиПрограммы",
		ЭлектроннаяПодписьСлужебныйКлиентСервер.ЗаголовокОшибкиДобавленияСертификата(
			?(Контекст.ДляШифрования = Истина, "Шифрование", "Подписание")));
		
	Контекст.Вставить("ДанныеСертификата", Сертификат);
	Контекст.Вставить("АлгоритмПодписи",
		ЭлектроннаяПодписьСлужебныйКлиентСервер.АлгоритмПодписиСертификата(Сертификат));
		
	Если ТипЗнч(Контекст.ДанныеСертификата) = Тип("Строка")
		И ЭтоАдресВременногоХранилища(Контекст.ДанныеСертификата) Тогда
		
		Контекст.ДанныеСертификата = ПолучитьИзВременногоХранилища(Контекст.ДанныеСертификата);
	КонецЕсли;
	
	Если ОбщиеНастройки().ПроверятьЭлектронныеПодписиНаСервере Тогда
		
		СсылкаНаСертификат = ЭлектроннаяПодписьСлужебныйВызовСервера.ЗаписатьСертификатПослеПроверки(Контекст);
		Если СсылкаНаСертификат <> Неопределено Тогда
			ВыполнитьОбработкуОповещения(ОбработчикЗавершения, СсылкаНаСертификат);
			Возврат;
		КонецЕсли;
		
	КонецЕсли;
	
	Контекст.Вставить("ОбработчикЗавершения", ОбработчикЗавершения);
	
	ПараметрыСоздания = ЭлектроннаяПодписьСлужебныйКлиент.ПараметрыСозданияМенеджераКриптографии();
	ПараметрыСоздания.ПоказатьОшибку = Неопределено;
	ПараметрыСоздания.АлгоритмПодписи = Контекст.АлгоритмПодписи;
	
	ЭлектроннаяПодписьСлужебныйКлиент.СоздатьМенеджерКриптографии(
		Новый ОписаниеОповещения("ДобавитьСертификатПослеСозданияМенеджераКриптографии",
		ЭлектроннаяПодписьСлужебныйКлиент, Контекст), "", ПараметрыСоздания);
	
КонецПроцедуры

#КонецОбласти

#Область ИнтерактивноеДобавлениеСертификата

// Инициализирует структуру параметров для интерактивного добавления сертификата.
// Если параметр СоздатьЗаявление - Истина и ИзЛичногоХранилища - Ложь, открывает новое заявление
// на выпуск сертификата.
// Если параметр СоздатьЗаявление - Ложь и ИзЛичногоХранилища - Истина, добавляет сертификат из
// личного хранилища.
// Если параметр СоздатьЗаявление - Истина и ИзЛичногоХранилища - Истина, открывает окно выбора
// способа добавления сертификата.
// Для использования в ЭлектроннаяПодписьКлиент.ДобавитьСертификат
//
// Возвращаемое значение:
//   Структура:
//      * ВЛичныйСписок      - Булево - если параметр принимает значение Истина, то реквизит Пользователь
//                           будет заполнен текущим пользователем, иначе - реквизит не будет заполнен.
//                           Значение по умолчанию - Ложь.
//      * Организация        - ОпределяемыйТип.Организация - организация, к которой относится сертификат.
//                           Значение по умолчанию - Неопределено.
//                           В случае, когда параметр используется для создания заявления, тогда значение
//                           передается в процедуру ПриЗаполненииРеквизитовОрганизацииВЗаявленииНаСертификат
//                           общего модуля ЗаявлениеНаСертификатПереопределяемый без изменения, а после вызова
//                           приводится к составу типов свойства ТипОрганизации.
//      * СоздатьЗаявление   - Булево - если параметр принимает значение Истина, добавляет возможность
//                           создать новое заявление на выпуск сертификата.
//                           Значение по умолчанию - Истина.
//      * ИзЛичногоХранилища - Булево - если параметр принимает значение Истина, добавляет возможность
//                           выбрать сертификат из установленных в личном хранилище.
//                           Значение по умолчанию - Истина.
//      * ФизическоеЛицо     - СправочникСсылка - физическое лицо, для которого нужно создать заявление
//                           на выпуск сертификата (когда заполнено, имеет приоритет над организацией).
//                           Значение по умолчанию - Неопределено.
//                           Значение передается в процедуру ПриЗаполненииРеквизитовВладельцаВЗаявленииНаСертификат
//                           общего модуля ЗаявлениеНаСертификатПереопределяемый без изменения, а после вызова
//                           приводится к составу типов свойства ТипВладельца.
//
Функция ПараметрыДобавленияСертификата() Экспорт
	
	ПараметрыДобавления = Новый Структура;
	ПараметрыДобавления.Вставить("ВЛичныйСписок", Ложь);
	ПараметрыДобавления.Вставить("Организация", Неопределено);
	ПараметрыДобавления.Вставить("СоздатьЗаявление", Истина);
	ПараметрыДобавления.Вставить("ИзЛичногоХранилища", Истина);
	ПараметрыДобавления.Вставить("ФизическоеЛицо", Неопределено);
	
	Возврат ПараметрыДобавления;
	
КонецФункции

// Интерактивно добавляет сертификат из установленных на компьютере или создает заявление на выпуск сертификата.
//
// Параметры:
//   ОбработчикЗавершения - ОписаниеОповещения - вызывается после добавления сертификата со значением одного из типов:
//      = Неопределено - при проверке или добавлении сертификата произошла ошибка.
//      = Структура:
//          # Ссылка   - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - добавленный сертификат.
//          # Добавлен - Булево - признак того, что сертификат успешно добавлен. Если сертификат добавляется
//                      с помощью заявления на выпуск нового квалифицированного сертификата, признак принимает
//                      значение Ложь пока заявление не будет исполнено и сертификат не будет установлен на 
//                      компьютере.
//   ПараметрыДобавления - Неопределено - без дополнительных параметров.
//                       - см. ЭлектроннаяПодписьКлиент.ПараметрыДобавленияСертификата
//
// Пример:
//  1) Добавление сертификата из установленных в личном хранилище:
//  ПараметрыДобавления = ЭлектроннаяПодписьКлиент.ПараметрыДобавленияСертификата();
//  ПараметрыДобавления.СоздатьЗаявление = Ложь;
//  ЭлектроннаяПодписьКлиент.ДобавитьСертификат(, ПараметрыДобавления);
//  
//  2) Создание заявления на выпуск сертификата:
//  ПараметрыДобавления = ЭлектроннаяПодписьКлиент.ПараметрыДобавленияСертификата();
//  ПараметрыДобавления.ИзЛичногоХранилища = Ложь;
//  ЭлектроннаяПодписьКлиент.ДобавитьСертификат(, ПараметрыДобавления);
//  
//  3) Интерактивный выбор способа добавления сертификата:
//  ЭлектроннаяПодписьКлиент.ДобавитьСертификат();
//
Процедура ДобавитьСертификат(ОбработчикЗавершения = Неопределено, ПараметрыДобавления = Неопределено) Экспорт
	
	Если ПараметрыДобавления = Неопределено Тогда
		ПараметрыДобавления = ПараметрыДобавленияСертификата();
	КонецЕсли;
	
	ПараметрыИнтерактивногоВыбора = Новый Структура("ВЛичныйСписок, Организация, ФизическоеЛицо");
	ЗаполнитьЗначенияСвойств(ПараметрыИнтерактивногоВыбора, ПараметрыДобавления);
	
	Если Не ПараметрыДобавления.СоздатьЗаявление
		И Не ПараметрыДобавления.ИзЛичногоХранилища Тогда
		
		Возврат;
	КонецЕсли;
	
	ПараметрыИнтерактивногоВыбора.Вставить("СкрытьЗаявление",
		ПараметрыДобавления.ИзЛичногоХранилища И Не ПараметрыДобавления.СоздатьЗаявление);
	ПараметрыИнтерактивногоВыбора.Вставить("СоздатьЗаявление",
		ПараметрыДобавления.СоздатьЗаявление И Не ПараметрыДобавления.ИзЛичногоХранилища);
	
	ЭлектроннаяПодписьСлужебныйКлиент.ДобавитьСертификат(ПараметрыИнтерактивногоВыбора, ОбработчикЗавершения);
	
КонецПроцедуры

#КонецОбласти

#Область ДляВызоваИзДругихПодсистем

// Следующие процедуры и функции предназначены для интеграции с 1С:Библиотека электронных документов.

// Создает и возвращает менеджер криптографии (на клиенте) для указанной программы или данных.
//
// Параметры:
//  Оповещение     - ОписаниеОповещения - оповещение о результате выполнения следующих типов:
//                   = МенеджерКриптографии - инициализированный менеджер криптографии.
//                   = Строка - описание ошибки при создании менеджера криптографии.
//
//  Операция       - Строка - если не пустая, то должна содержать одну из строк, которые определяют
//                   операцию для вставки в описание ошибки: Подписание, ПроверкаПодписи, Шифрование,
//                   Расшифровка, ПроверкаСертификата, ПолучениеСертификатов.
//
//  ПоказатьОшибку - Булево - если Истина, тогда будет открыта форма ОшибкаОбращенияКПрограмме
//                   из которой можно перейти к списку установленных программ
//                   в форму персональных настроек на страницу "Установленные программы",
//                   в которой можно увидеть почему программу не удалось задействовать,
//                   а также открыть инструкцию по установке.
//
//  Программа      - Неопределено - возвращает менеджер криптографии первой
//                   программы, для которой удалось его создать.
//                 - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования - программа
//                   для которой нужно создать и вернуть менеджер криптографии.
//                 - Структура - см. ЭлектроннаяПодпись.НовоеОписаниеПрограммы.
//                 - ДвоичныеДанные - данные подписи или сертификата в кодировке DER для определения программы.
//                 - Строка - адрес двоичных данных, описанных выше, во временном хранилище.
//
Процедура СоздатьМенеджерКриптографии(Оповещение, Операция, ПоказатьОшибку = Истина, Программа = Неопределено) Экспорт
	
	Если ТипЗнч(Операция) <> Тип("Строка") Тогда
		Операция = "";
	КонецЕсли;
	
	Если ПоказатьОшибку <> Истина Тогда
		ПоказатьОшибку = Ложь;
	КонецЕсли;
	
	ПараметрыСоздания = ЭлектроннаяПодписьСлужебныйКлиент.ПараметрыСозданияМенеджераКриптографии();
	ПараметрыСоздания.Программа = Программа;
	ПараметрыСоздания.ПоказатьОшибку = ПоказатьОшибку;
	
	ЭлектроннаяПодписьСлужебныйКлиент.СоздатьМенеджерКриптографии(Оповещение, Операция, ПараметрыСоздания);
	
КонецПроцедуры

// Находит сертификат на компьютере по строке отпечатка.
// Только для работы через средства платформы (МенеджерКриптографии).
//
// Параметры:
//   Оповещение           - ОписаниеОповещения - оповещение о результате выполнения следующих типов:
//     = СертификатКриптографии - найденный сертификат.
//     = Неопределено           - сертификат не существует в хранилище.
//     = Строка                 - текст ошибки создания менеджера криптографии (или другая ошибка).
//
//   Отпечаток              - Строка - Base64 кодированный отпечаток сертификата.
//   ТолькоВЛичномХранилище - Булево - если Истина, тогда искать в личном хранилище, иначе везде.
//   ПоказатьОшибку         - Булево - если Ложь, тогда ошибка, текст который будет возвращен, не будет показана.
//
Процедура ПолучитьСертификатПоОтпечатку(Оповещение, Отпечаток, ТолькоВЛичномХранилище, ПоказатьОшибку = Истина) Экспорт
	
	Если ТипЗнч(ПоказатьОшибку) <> Тип("Булево") Тогда
		ПоказатьОшибку = Истина;
	КонецЕсли;
	
	ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьСертификатПоОтпечатку(Оповещение,
		Отпечаток, ТолькоВЛичномХранилище, ПоказатьОшибку);
	
КонецПроцедуры

// Получает отпечатки сертификатов пользователя ОС на компьютере.
// Только для работы через средства платформы (МенеджерКриптографии).
//
// Параметры:
//  Оповещение     - ОписаниеОповещения - вызывается для передачи возвращаемого значения следующих типов:
//                     = Соответствие - Ключ - отпечаток в формате строки Base64, а Значение - Истина,
//                     = Строка - текст ошибки создания менеджера криптографии (или другая ошибка).
//
//  ТолькоЛичные   - Булево - если Ложь, то к личным сертификатам добавляются сертификаты получателей.
//
//  ПоказатьОшибку - Булево - показать ошибку создания менеджера криптографии.
//
Процедура ПолучитьОтпечаткиСертификатов(Оповещение, ТолькоЛичные, ПоказатьОшибку = Истина) Экспорт
	
	ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьОтпечаткиСертификатов(Оповещение, ТолькоЛичные, ПоказатьОшибку);
	
КонецПроцедуры

//  Процедура проверяет наличие сертификата в личном хранилище, срок действия, что текущий пользователь
//  указан в сертификате или не указан никакой, а также, что заполнена программа для работы с сертификатом.
//
//  Параметры:
//   Оповещение - ОписаниеОповещения - оповещение с результатом типа:
//     = Массив Из Структура:
//            # Ссылка       - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - ссылка на сертификат.
//            # Наименование - Строка - представление сертификата в списке.
//            # Отпечаток    - Строка - отпечаток сертификата в формате строки Base64.
//            # Данные       - Строка - адрес временного хранилища, содержащего двоичные данные сертификата.
//            # Организация  - ОпределяемыйТип.Организация - организация к которой относится сертификат.
//   Отбор - Неопределено - использовать значения по умолчанию, для свойств структуры, описанных ниже.
//         - Структура:
//                 * ПроверятьСрокДействия - Булево - если свойства нет, значит Истина.
//                 * ТолькоСертификатыСЗаполненнойПрограммой - Булево - если свойства нет, значит Истина,
//                         в запросе к справочнику выбираются только те сертификаты,
//                         у которых заполнено поле Программа.
//                 * ВключатьСертификатыСПустымПользователем - Булево - если свойства нет, значит Истина,
//                         в запросе к справочнику выбираются не только сертификаты, у которых поле Пользователь
//                         совпадает с текущим пользователем, но и те, у которых оно не заполнено.
//                 * Организация - ОпределяемыйТип.Организация - если свойство есть и заполнено, тогда
//                         в запросе к справочнику выбираются только сертификаты, у которых поле Организация
//                         совпадает с указанной.
//
Процедура НайтиДействительныеЛичныеСертификаты(Оповещение, Отбор = Неопределено) Экспорт
	
	МассивТиповОтбора = Новый Массив;
	МассивТиповОтбора.Добавить(Тип("Структура"));
	МассивТиповОтбора.Добавить(Тип("Неопределено"));
	
	ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ЭлектроннаяПодписьКлиент.НайтиДействительныеЛичныеСертификаты",
		"Отбор", Отбор, МассивТиповОтбора);
	
	ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ЭлектроннаяПодписьКлиент.НайтиДействительныеЛичныеСертификаты",
		"Оповещение", Оповещение, Тип("ОписаниеОповещения"));
	
	ЭлектроннаяПодписьСлужебныйКлиент.НайтиДействительныеЛичныеСертификаты(Оповещение, Отбор);
	
КонецПроцедуры

// Осуществляет поиск установленных программ на клиенте и на сервере.
// Только для работы через средства платформы (МенеджерКриптографии).
//
// Параметры:
//   Оповещение - ОписаниеОповещения - оповещение с результатом типа:
//     = Массив - со значениями Структура со свойствами, как и ЭлектроннаяПодпись.НовоеОписаниеПрограммы,
//                а также дополнительными свойствами:
//       # Установлена                 = Булево - если Истина, то установлена либо на клиенте, либо на сервере.
//       # РезультатПроверкиНаКлиенте  = Строка - если пустая строка, то установлена, иначе описание ошибки.
//       # РезультатПроверкиНаСервере  = Строка - если пустая строка, то установлена, иначе описание ошибки.
//                                     = Неопределено - проверка не выполнялась.
//
//   ОписаниеПрограмм   - Неопределено - проверять только известные программы, которые заполняются процедурой
//                                 ЭлектроннаяПодпись.ЗаполнитьСписокПрограмм, если передать пустой массив.
//                      - Массив - со значениями, как возвращает функция ЭлектроннаяПодпись.НовоеОписаниеПрограммы.
//                                 Указанные описания будут добавлены к поставляемым описаниям или
//                                 заменят их в части совпадений имени и типа программы.
//
//   ПроверятьНаСервере - Неопределено - проверять на сервере, если подписание или шифрование на сервере включено.
//                      - Булево - если Истина проверять на сервере, иначе не проверять,
//                                 независимо от того включено подписание или шифрование на сервере или нет.
//
Процедура НайтиУстановленныеПрограммы(Оповещение, ОписаниеПрограмм = Неопределено, ПроверятьНаСервере = Неопределено) Экспорт
	
	Если ОписаниеПрограмм = Неопределено Тогда
		ОписаниеПрограмм = Новый Массив;
	КонецЕсли;
	
	МассивТиповПроверятьНаСервере = Новый Массив;
	МассивТиповПроверятьНаСервере.Добавить(Тип("Булево"));
	МассивТиповПроверятьНаСервере.Добавить(Тип("Неопределено"));
	
	ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ЭлектроннаяПодписьКлиент.НайтиУстановленныеПрограммы", "ПроверятьНаСервере", 
		ПроверятьНаСервере, МассивТиповПроверятьНаСервере);
		
	ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ЭлектроннаяПодписьКлиент.НайтиУстановленныеПрограммы", "Оповещение", 
		Оповещение, Тип("ОписаниеОповещения"));
		
	ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ЭлектроннаяПодписьКлиент.НайтиУстановленныеПрограммы", "ОписаниеПрограмм", 
		ОписаниеПрограмм, Тип("Массив"));
	
	ЭлектроннаяПодписьСлужебныйКлиент.НайтиУстановленныеПрограммы(Оповещение, ОписаниеПрограмм, ПроверятьНаСервере);
	
КонецПроцедуры

// Выполняет проверку установленных программ и предлагает установку в зависимости от переданных параметров.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения.
//  ПараметрыПроверки - Неопределено, Структура:
//   * ПредлагатьУстановитьПрограмму - Булево - если Истина, будет открыта форма обработки 
//      см. Обработка.ПрограммыЭлектроннойПодписиИШифрования.УстановкаПрограммКриптопровайдеров,
//      если она существует и если список установленных программ пуст. По умолчанию, если ПроверяемыеПрограммы = Истина 
//      и не используется облачная подпись и криптографические операции на сервере - Истина, иначе - Ложь.
//   * ПроверяемыеПрограммы - Структура
//      - Неопределено - (по умолчанию) возвращаются все установленные программы.
//      - Булево - см. ЭлектроннаяПодписьСлужебныйКлиентСервер.АктуальныеАлгоритмыПрограмм
//      - ДвоичныеДанные - данные подписи или сертификата, для проверки наличия подходящих программ.
//      - Строка - адрес во временном хранилище данных подписи или сертификата, для проверки наличия подходящих программ.
//      - Массив - со значениями, как возвращает функция ЭлектроннаяПодпись.НовоеОписаниеПрограммы.
//   * УстанавливатьКомпоненту - Булево - (по умолчанию Истина) запрашивать установку компоненты
//        для автоматического определения установленных программ.
//   * УстанавливатьРасширение - Булево - (по умолчанию Истина) запрашивать установку расширения криптографии
//        для автоматического определения установленных программ.
//   * ПроверятьНаСервере - Булево, Неопределено - (по умолчанию Неопределено) - если Неопределено, проверять на сервере
//                                                 в зависимости от общих настроек.
//  ОповещениеОЗавершении - ОписаниеОповещения - оповещение о результате выполнения, один из типов:
//     = Структура:
//     # ПроверкаВыполнена = Булево - Истина, если проверка выполнена на компьютере, получены установленные криптопровайдеры.
//                           если Ложь, то будет заполнена Ошибка.
//     # Ошибка = Строка - текст ошибки.
//     # Программы = Массив Из Структура - только установленные на клиенте программы.
//          ## ИмяПрограммы  - Строка  - имя криптопровайдера, например "Infotecs GOST 2012/512 Cryptographic Service Provider"
//          ## ТипПрограммы  - Число  - тип криптопровайдера, например, 77
//          ## Имя           - Строка  - представление программы для установки, из списка поставляемых,
//             например НСтр("ru = 'ViPNet CSP'")
//          ## Версия        - Строка - версия библиотеки
//          ## Лицензия      - Булево - есть лицензия
//     # ПрограммыНаСервере = см. Программы - только установленные на сервере программы, из переданных в параметре
//                                            ПроверяемыеПрограммы.
//     # ВозможенКонфликт = Булево - установлено несколько программ криптографии, между
//     которыми возможен конфликт.
//     # ВозможенКонфликтНаСервере = Булево - установлено несколько программ криптографии,
//     между которыми возможен конфликт.
//
Процедура ПроверитьУстановкуПрограммКриптографии(Форма, ПараметрыПроверки = Неопределено, ОповещениеОЗавершении = Неопределено) Экспорт
	
	ЭлектроннаяПодписьСлужебныйКлиент.ПроверитьУстановкуПрограммКриптографии(Форма, ПараметрыПроверки, ОповещениеОЗавершении);
	
КонецПроцедуры

// Устанавливает пароль в хранилище паролей на клиенте на время сеанса.
// Только для работы через средства платформы (МенеджерКриптографии).
//
// Установка пароля позволяют не вводить пароль пользователю при очередной
// операции, что полезно при выполнении пакета операций.
// Если для сертификата установлен пароль, тогда флажок ЗапомнитьПароль
// в формах ПодписаниеДанных и РасшифровкаДанных становится невидимым.
// Для отмены установленного пароля достаточно установить значение пароля Неопределено.
//
// Параметры:
//  СертификатСсылка - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - сертификат,
//                        для которого устанавливается пароль.
//
//  Пароль           - Строка - устанавливаемый пароль. Может быть пустой.
//                   - Неопределено - сбросить установленный пароль, если был установлен.
//
//  ПояснениеПароля   - Структура - со свойствами пояснения под паролем вместо флажка ЗапомнитьПароль:
//     * ТекстПояснения       - Строка - только текст;
//     * ПояснениеГиперссылка - Булево - если истина, то при нажатии на пояснение, вызывать ОбработкаДействия.
//     * ТекстПодсказки       - Строка
//                            - ФорматированнаяСтрока - текст или текст со ссылками.
//     * ОбработкаДействия    - ОписаниеОповещения - вызывает процедуру, в которую значение типа:
//        = Структура:
//          # Сертификат - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - ссылка
//                         на выбранный сертификат;
//          # Действие   - Строка - "ПояснениеНажатие" или навигационная ссылка подсказки.
// 
Процедура УстановитьПарольСертификата(СертификатСсылка, Пароль, ПояснениеПароля = Неопределено) Экспорт
	
	ЭлектроннаяПодписьСлужебныйКлиент.УстановитьПарольСертификата(СертификатСсылка, Пароль, ПояснениеПароля);
	
КонецПроцедуры

// Проверяет был ли пароль сертификата установлен на время сеанса,
// либо с помощью процедуры УстановитьПарольСертификата,
// либо после успешной операции со включенным флажком Сохранить пароль.
//
// Параметры:
//  СертификатСсылка - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - сертификат,
//                        для которого проверяется наличие пароля.
//
// Возвращаемое значение:
//  Булево - если Ложь, пароль не установлен, иначе установлен.
//
Функция ПарольСертификатаУстановлен(СертификатСсылка) Экспорт
	
	Возврат ЭлектроннаяПодписьСлужебныйКлиент.ПарольСертификатаУстановлен(СертификатСсылка);
	
КонецФункции

// Переопределяет обычный выбор сертификата из справочника на выбор сертификата
// из личного хранилища с подтверждением паролем и автоматическим добавлением в справочник,
// если сертификата в справочнике еще нет.
//
// Параметры:
//  Элемент    - ПолеФормы - элемент формы, в который будет передано выбранное значение.
//  Сертификат - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - текущее значение,
//               выбранное в поле Элемент, которое нужно чтобы выделить соответствующую строку списка.
//
//  СтандартнаяОбработка - Булево - стандартный параметр события НачалоВыбора, который нужно сбросить в Ложь.
//  
//  ДляШифрованияИРасшифровки - Булево - управляет заголовком формы выбора. Начальное значение Ложь.
//                              Ложь - для подписания, Истина - для шифрования и расшифровки,
//                            - Неопределено - для подписания и шифрования.
//
Процедура СертификатНачалоВыбораСПодтверждением(Элемент, Сертификат, СтандартнаяОбработка, ДляШифрованияИРасшифровки = Ложь) Экспорт
	
	СтандартнаяОбработка = Ложь;
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ВыбранныйСертификат", Сертификат);
	ПараметрыФормы.Вставить("ДляШифрованияИРасшифровки", ДляШифрованияИРасшифровки);
	
	ЭлектроннаяПодписьСлужебныйКлиент.ВыборСертификатаДляПодписанияИлиРасшифровки(ПараметрыФормы, Элемент);
	
КонецПроцедуры

// Показывает результат проверки сертификата, выполнявшейся в фоновом режиме.
//
// Параметры:
//   Сертификат           - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - сертификат,
//                        для которого выполнялась проверка.
//   Результат            - см. ЭлектроннаяПодписьКлиент.ПроверитьСертификатСправочника.ДополнительныеПараметры.Результат
//   ВладелецФормы        - ФормаКлиентскогоПриложения - владелец открываемой формы проверки сертификата.
//   Заголовок            - Строка - заголовок открываемой формы проверки сертификата.
//   ОбъединятьРезультаты - Строка - определяет способ отображения результатов проверки в клиент-серверном
//                        варианте при использовании электронной подписи на сервере. Может принимать
//                        значения НеОбъединять, ОбъединятьПоИ, ОбъединятьПоИли. Если принимает значение 
//                        ОбъединятьПоИ или ОбъединятьПоИли, результаты проверки будут объединены с 
//                        соответствующим условием. В ином случае результаты будут отображаться
//                        раздельно для клиентской и серверной проверок.
//   ОбработкаЗавершения  - ОписаниеОповещения - содержит описание процедуры, которая будет вызвана после
//                        закрытия формы проверки сертификата.
//
Процедура ПоказатьРезультатПроверкиСертификата(Сертификат, Результат, ВладелецФормы,
	Заголовок = "", ОбъединятьРезультаты = "НеОбъединять", ОбработкаЗавершения = Неопределено) Экспорт
	
	ЭлектроннаяПодписьСлужебныйКлиент.ПоказатьРезультатПроверкиСертификата(
		Сертификат, Результат, ВладелецФормы, Заголовок, ОбъединятьРезультаты, ОбработкаЗавершения);
	
КонецПроцедуры

// Получить корневой сертификат из данных сертификата и установить его.
// 
// Параметры:
//  Сертификат - ДвоичныеДанные
//             - Строка - адрес во временном хранилище
//             - Строка - строковое представление сертификата в формате Base64
//             - СертификатКриптографии
//
Процедура УстановитьКорневойСертификат(Сертификат) Экспорт
	
	Параметры = ЭлектроннаяПодписьСлужебныйКлиент.ПараметрыУстановкиСертификата(Сертификат);
	ЭлектроннаяПодписьСлужебныйКлиент.УстановитьКорневойСертификат(Параметры);
	
КонецПроцедуры

// Получить свойства подписи из двоичных данных подписи без использования менеджера криптографии.
// 
// Параметры:
//  Оповещение - ОписаниеОповещения - возвращает результат в зависимости от переданных данных -
//                                   структуру со свойствами подписи или соответствие, 
//                                   если был передан массив, в котором Ключ - Подпись, Значение - Структура.
//   # Структура: 
//     ## ТипПодписи - ПеречислениеСсылка.ТипыПодписиКриптографии, Неопределено - Неопределено, если файл не является подписью.
//     ## СрокДействияПоследнейМеткиВремени - Дата, Неопределено - срок действия сертификата, которым подписана
//                                 последняя метка времени, заполняется только если удалось создать менеджер криптографии. 
//     ## ДатаПодписиИзМетки - Дата, Неопределено - самый ранний штамп времени: CADES-T, если его нет, но есть другие штампы,
//                                                   дата заполняется только с помощью менеджера криптографии.
//     ## НеподтвержденнаяДатаПодписи - Дата - неподтвержденная дата подписи.
//             - Неопределено - неподтвержденная дата подписи отсутствует в данных подписи.
//     ## Сертификаты - Массив Из ДвоичныеДанные - сертификаты для проверки подписи.
//     ## Сертификат  - ДвоичныеДанные - сертификат подписанта.
//     ## Отпечаток           - Строка - отпечаток сертификата в формате строки Base64.
//     ## КомуВыданСертификат - Строка - представление субъекта, полученное из двоичных данных сертификата. 
//     
//  Подпись - ДвоичныеДанные - данные подписи в кодировке DER.
//          - Строка - адрес во временном хранилище
//          - Массив из Строка
//          - Массив из ДвоичныеДанные
//  ПрочитатьСертификаты - Булево - заполнить свойства Сертификат и Сертификаты в возвращаемом значении.
//
Процедура ПрочитатьСвойстваПодписи(Оповещение, Подпись, ПрочитатьСертификаты = Истина) Экспорт

	ЭлектроннаяПодписьСлужебныйКлиент.ПрочитатьСвойстваПодписи(Оповещение, Подпись, ПрочитатьСертификаты);

КонецПроцедуры

// Следующие процедуры и функции предназначены для интеграции с 1С:Обмен с банками.

// Оповещает пользователя, что срок сертификата скоро истечет, с учетом признака "Больше не напоминать"
// 
// Параметры:
//  Сертификат - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования
//
Процедура ОповеститьОбОкончанииСрокаДействияСертификата(Сертификат) Экспорт
	
	Результат = ЭлектроннаяПодписьСлужебныйВызовСервера.ПользовательскиеНастройкиСертификата(Сертификат);

	Если ЗначениеЗаполнено(Результат.СсылкаНаСертификат) И Не Результат.Оповещен Тогда
		
		ПараметрыОткрытияФормы = Новый Структура("Сертификат", Сертификат);
		ДействиеПриНажатии = Новый ОписаниеОповещения("ОткрытьФормуОповещенияОНеобходимостиЗаменыСертификата",
			ЭлектроннаяПодписьСлужебныйКлиент, ПараметрыОткрытияФормы);
		ПоказатьОповещениеПользователя(НСтр("ru = 'Необходима замена сертификата'"), ДействиеПриНажатии, Сертификат,
			БиблиотекаКартинок.Предупреждение32, СтатусОповещенияПользователя.Важное, Сертификат);

	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

// Открывает форму просмотра подписи ЭП.
Процедура ОткрытьПодпись(ТекущиеДанные) Экспорт
	
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	СвойстваПодписи = Новый Структура(
		"ДатаПодписи, Комментарий, КомуВыданСертификат, Отпечаток,
		|АдресПодписи, УстановившийПодпись, АдресСертификата,
		|Статус, ОписаниеОшибки, ПодписьВерна, ДатаПроверкиПодписи, ТипПодписи, СрокДействияПоследнейМеткиВремени,
		|Объект, ПорядковыйНомер, ТребуетсяПроверка, МашиночитаемаяДоверенность, МашиночитаемаяДоверенностьВерна, РезультатПроверкиПодписиПоМЧД");
	
	ЗаполнитьЗначенияСвойств(СвойстваПодписи, ТекущиеДанные);
	
	ПараметрыФормы = Новый Структура("СвойстваПодписи", СвойстваПодписи);
	ОткрытьФорму("ОбщаяФорма.ЭлектроннаяПодпись", ПараметрыФормы);
	
КонецПроцедуры

Процедура ОткрытьФормуПродленияДействияПодписей(Форма, ПараметрыПродления, ОбработчикПродолжения = Неопределено) Экспорт
	
	ОткрытьФорму("ОбщаяФорма.ПродлениеСрокаДействияЭлектронныхПодписей", ПараметрыПродления,
		Форма,,,,ОбработчикПродолжения, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
		
КонецПроцедуры

// Открывает форму отчета ПродлениеСрокаДействияЭлектронныхПодписей.
// 
// Параметры:
//  РежимПродления - Строка - вариант отчета 
//   "НеобработанныеПодписи", "ТребуетсяУсовершенствоватьПодписи", 
//   "ТребуетсяДобавитьАрхивныеМетки", "ОшибкиПриАвтоматическомПродлении"
//
Процедура ОткрытьОтчетПродлениеСрокаДействияЭлектронныхПодписей(РежимПродления) Экспорт
	
	ОткрытьФорму("Отчет.ПродлениеСрокаДействияЭлектронныхПодписей.Форма", 
		Новый Структура("РежимПродления", РежимПродления));
	
КонецПроцедуры


// Сохраняет подпись на компьютер.
Процедура СохранитьПодпись(АдресПодписи) Экспорт
	
	ЭлектроннаяПодписьСлужебныйКлиент.СохранитьПодпись(АдресПодписи);
	
КонецПроцедуры

// Открывает форму просмотра данных сертификата.
//
// Параметры:
//  ДанныеСертификата - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - ссылка на сертификат.
//                    - СертификатКриптографии - имеющийся сертификат.
//                    - ДвоичныеДанные - двоичные данные сертификата.
//                    - Строка - адрес временного хранилища содержащий ДвоичныеДанные сертификата.
//                    - Строка - отпечаток сертификата для поиска во всех хранилищах.
//
//  ОткрытьДанные     - Булево - открыть данные сертификата, а не форму элемента справочника.
//                      Если передана не ссылка на элемент справочника и элемент справочника
//                      не удалось найти по отпечатку, тогда будут открыты данные сертификата.
//
Процедура ОткрытьСертификат(ДанныеСертификата, ОткрытьДанные = Ложь) Экспорт
	
	ЭлектроннаяПодписьСлужебныйКлиент.ОткрытьСертификат(ДанныеСертификата, ОткрытьДанные);
	
КонецПроцедуры

// По окончании подписания сообщает о подписании.
//
// Параметры:
//  ПредставлениеДанных - Произвольный - ссылка на объект, к которому
//                          добавлена электронная подпись.
//  МножествоДанных     - Булево - определяет вид сообщения множественное
//                          или единственное число элементов.
//  ИзФайла             - Булево - определяет вид сообщения добавления
//                          электронной подписи или файла.
//
Процедура ИнформироватьОПодписанииОбъекта(ПредставлениеДанных, МножествоДанных = Ложь, ИзФайла = Ложь) Экспорт
	
	Если ИзФайла Тогда
		Если МножествоДанных Тогда
			ТекстСообщения = НСтр("ru = 'Добавлены подписи из файлов:'");
		Иначе
			ТекстСообщения = НСтр("ru = 'Добавлена подпись из файла:'");
		КонецЕсли;
	Иначе
		Если МножествоДанных Тогда
			ТекстСообщения = НСтр("ru = 'Установлены подписи:'");
		Иначе
			ТекстСообщения = НСтр("ru = 'Установлена подпись:'");
		КонецЕсли;
	КонецЕсли;
	
	ПоказатьОповещениеПользователя(ТекстСообщения, , ПредставлениеДанных);
	
КонецПроцедуры

// По окончании шифрования сообщает о завершении.
//
// Параметры:
//  ПредставлениеДанных - Произвольный - ссылка на объект,
//                          данные которого зашифрованы.
//  МножествоДанных     - Булево - определяет вид сообщения множественное
//                          или единственное число элементов.
//
Процедура ИнформироватьОШифрованииОбъекта(ПредставлениеДанных, МножествоДанных = Ложь) Экспорт
	
	ТекстСообщения = НСтр("ru = 'Выполнено шифрование:'");
	
	ПоказатьОповещениеПользователя(ТекстСообщения, , ПредставлениеДанных);
	
КонецПроцедуры

// По окончании расшифровки сообщает о завершении.
//
// Параметры:
//  ПредставлениеДанных - Произвольный - ссылка на объект,
//                          данные которого расшифрованы.
//  МножествоДанных     - Булево - определяет вид сообщения множественное
//                          или единственное число элементов.
//
Процедура ИнформироватьОРасшифровкеОбъекта(ПредставлениеДанных, МножествоДанных = Ложь) Экспорт
	
	ТекстСообщения = НСтр("ru = 'Выполнена расшифровка:'");
	
	ПоказатьОповещениеПользователя(ТекстСообщения, , ПредставлениеДанных);
	
КонецПроцедуры

// См. ЭлектроннаяПодпись.ПерсональныеНастройки.
Функция ПерсональныеНастройки() Экспорт
	
	Возврат СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ЭлектроннаяПодпись.ПерсональныеНастройки;
	
КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

// См. ЭлектроннаяПодпись.ОбщиеНастройки.
Функция ОбщиеНастройки() Экспорт
	
	Возврат СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ЭлектроннаяПодпись.ОбщиеНастройки;
	
КонецФункции

#КонецОбласти
